Как проверить, является ли ответ JSON API пустым или имеет ошибку?

Я новичок в 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

Если код ответа выше 400, вы можете использовать блок catch, чтобы поймать ошибку, или же вы можете напрямую сделать res.json(). Что-то вроде этого fetch("dummy.restapiexample.com/api/v1/…",err));

Rajesh Kumaran 29.05.2019 14:06

@RajeshKumaran Но код состояния 200OK как в случае ошибки, так и в случае успеха. Итак, как я могу проверить, присутствует ли ответ JSON или нет?

MOHIT SHARMA 29.05.2019 14:09

Вы смотрели (отладчик или console.info весь response объект? Может быть, это проблема больше с API?

crashmstr 29.05.2019 14:16

если код ответа 200, то у вас будет ключ с именем error, тогда как вы определите его ошибку

Rajesh Kumaran 29.05.2019 14:18

Проблема решена, на самом деле если код состояния 200, то если ошибки нет, то строка response.json() выдаст ошибку, так как ответа нет. Итак, я возвращаю response.text(), тогда проблема решена, так как теперь я могу проверить, является ли response.text() пустым или нет. ЕСЛИ пустой, то ошибки нет, иначе в нем присутствует ошибка.

MOHIT SHARMA 29.05.2019 14:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
5
4 119
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть несколько проблем с этим imo:

  1. Обратный вызов следует реорганизовать, чтобы избежать использования переменной флага. Код в функции, предоставляемой обработчикам, таким как then, catch и finally промисов, выполняется асинхронно. Поэтому вы не можете быть уверены / (не должны предполагать), когда это значение будет присвоено и в каком состоянии находится ваш контекст в это время.

  2. .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
}))

Другие вопросы по теме