Я новичок в reactjs, и я застрял в одной проблеме. Я вызываю API обновления типа PUT. Я использую функцию выборки для вызова API в reactjs и проверяю ответ API. Если ответ 200 OK, я возвращаю response.json()
и затем проверяю, есть ли в объекте json ошибка или нет. Если у него есть ошибка, я печатаю ошибку, иначе я ее обновляю.
Но когда в ответе нет ошибки, я получаю синтаксическую ошибку в выражении return response.json()
, и если в ответе действительно присутствует ошибка, то синтаксическая ошибка не отображается. Итак, есть ли способ проверить, пуст ли ответ или нет, чтобы, соответственно, я мог вернуть response.json()
.
Я попытался поставить условие как if (response.json() != '')
, но он показывает ошибку в выражении response.json()
.
fetch( API + name , {
method: 'PUT',
headers: {
'Accept' : 'application/json',
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + localStorage.getItem('access_token')
},
body: JSON.stringify({
name: name,
description: updateDesc
}),
}).then(function(response) {
if (response.status == '200'){
flag=true;
return response.json();
}
else {
flag=false
}
})
.then(json => {
if (flag)
{
if (json.Error != "")
{
that.createNotification('error','update');
}
else {
this.createNotification('success','update');
}
}
});
Необработанный отказ (SyntaxError): неожиданный конец ввода JSON
@RajeshKumaran Но код состояния 200OK как в случае ошибки, так и в случае успеха. Итак, как я могу проверить, присутствует ли ответ JSON или нет?
Вы смотрели (отладчик или console.info
весь response
объект? Может быть, это проблема больше с API?
если код ответа 200, то у вас будет ключ с именем error, тогда как вы определите его ошибку
Проблема решена, на самом деле если код состояния 200, то если ошибки нет, то строка response.json() выдаст ошибку, так как ответа нет. Итак, я возвращаю response.text(), тогда проблема решена, так как теперь я могу проверить, является ли response.text() пустым или нет. ЕСЛИ пустой, то ошибки нет, иначе в нем присутствует ошибка.
Есть несколько проблем с этим imo:
Обратный вызов следует реорганизовать, чтобы избежать использования переменной флага. Код в функции, предоставляемой обработчикам, таким как then
, catch
и finally
промисов, выполняется асинхронно. Поэтому вы не можете быть уверены / (не должны предполагать), когда это значение будет присвоено и в каком состоянии находится ваш контекст в это время.
.then(json => {
если есть ошибка, это фактически будет использовать обещание, возвращенное fetch
ака response
, а не обещание, возвращенное response.json()
(в настоящее время return response.json()
выполняется только в случае успеха)
Обратите внимание, что это происходит (в настоящее время работает в случае ошибки), потому что вы можете связывать промисы. Вы можете найти дополнительную информацию и примеры об этом здесь
Я бы реорганизовал обработку обещания fetch следующим образом:
const fetchPromise = fetch(<your params>);
fetchPromise.then(response => {
if (response.ok()){
//Your request was successful
const jsonPromise = response.json();
jsonPromise.then(data => {
console.info("Successful request, parsed json body", data);
}).catch(error => {
//error handling for json parsing errors (empty body etc.)
console.info("Successful request, Could not parse body as json", error);
})
} else {
//Your request was not successful
/*
You can check the body of the response here anyways. Maybe your api does return a json error?
*/
}
}).catch(error => {
//error handling for fetch errors
}))
Если код ответа выше 400, вы можете использовать блок catch, чтобы поймать ошибку, или же вы можете напрямую сделать res.json(). Что-то вроде этого fetch("dummy.restapiexample.com/api/v1/…",err));