Как использовать возвращенную ошибку JSON при вызове JavaScript asyn c - PullRequest
0 голосов
/ 22 января 2020

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

Если бэкэнд возвращает код состояния, отличный от 200, он также возвращает JSON, как {"message": "Something went wrong"}. Я хочу catch сообщить об ошибке и отправить это сообщение console.

. Я прочитал десятки слегка похожих вопросов и приблизился к ответу. Пока что у меня есть следующее, но если ответ бэкэнда был, например, кодом состояния 403, то консоль выдает «ЗАПРЕЩЕНО». Я думаю это потому, что обещание еще не выполнено, поэтому еще не получил полного ответа JSON. Или что-то. Но я не могу понять, что мне не хватает.

async function createCustomer(email) {
  return fetch("/api/create-customer", {
    method: "post",
    headers: {"Content-Type": "application/json"},
    body: JSON.stringify({email: email})
  })
    .then(function(response) {
      if (response.ok) {
        return response.json();
      } else {
        return Promise.reject({
          status: response.status,
          statusText: response.statusText
        });
      }
    })
    .then(function(returned_data) {
      doNextThing(returned_data);
    })
    .catch(function(e) {
      console.error(e.statusText);
    });
}

Ответы [ 2 ]

2 голосов
/ 22 января 2020

Лично я рекомендую синтаксис async / await, если версия, которую вы используете, поддерживает его. Это действительно упрощает код и позволяет легко использовать синтаксис try / catch.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await#Browser_compatibility

Кажется, он не работает в IE если это нарушитель.

async function createCustomer(email) {
try {
    const response = await fetch("/api/create-customer", {
        method: "post",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ email: email })
    })
    if (response.ok) {
        const returnedData = await response.json();
        // if doNextThing is an async function, you can await it as well or just return it 
        doNextThing(returnedData);
    } else {
        throw {
            json: await response.json()
            status: response.status,
            statusText: response.statusText
        };
    }
} catch (requestErr) {
    // do what you like with the error
    // this will be called if you "throw" above or '
    // if fetch() rejects
    if (requestErr.json){
        console.error(JSON.stringify(requestErr.json));
    }
    console.error("Request err:" + requestErr);
}

}

Дайте мне знать, если это поможет.

0 голосов
/ 22 января 2020

Вы должны быть в состоянии получить контент, используя ответ. json () в обработчике catch.

...