Как проверить, является ли ответ JSON API пустым или имеет ошибку? - PullRequest
0 голосов
/ 29 мая 2019

Я новичок в реагировании и застрял в одной проблеме.Я вызываю Update API, который имеет тип PUT.Я использую функцию fetch, чтобы вызвать API вactjs, и проверяю ответ API.Если Response равен 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

1 Ответ

1 голос
/ 29 мая 2019

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

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

  2. .then(json => { в случае ошибки это приведетфактически используйте обещание, возвращаемое fetch aka response, а не обещание, возвращаемое response.json() (в настоящее время return response.json() выполняется только в случае успеха)

    Обратите внимание, что это происходит (в настоящее время работает вошибка), потому что вы можете цепочки обещаний.Вы можете найти больше информации и примеров об этом здесь

Я бы реорганизовал обработку обещания получения следующим образом:

const fetchPromise = fetch(<your params>);

fetchPromise.then(response => {
  if (response.ok()){
    //Your request was successful
    const jsonPromise = response.json();
    jsonPromise.then(data => {
      console.log("Successful request, parsed json body", data);
    }).catch(error => {
      //error handling for json parsing errors (empty body etc.)
      console.log("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
}))

...