Аксиос. Как получить ответ на ошибку, даже если api вернет ошибку 404, в try catch, наконец,

#node.js #reactjs #axios #next.js

Вопрос:

например, для

 (async() => {
  let apiRes = null;
  try {
    apiRes = await axios.get('https://silex.edgeprop.my/api/v1/a');
  } catch (err) {
    console.error(err);
  } finally {
    console.log(apiRes);
  }
})();
 

in finally , apiRes вернет значение null.

Даже когда api получает ответ 404, в ответе все равно есть полезная информация, которую я хотел бы использовать.

Как я могу использовать ответ на ошибку finally , когда axios выдает ошибку.

https://jsfiddle.net/jacobgoh101/fdvnsg6u/1/

Комментарии:

1. Досадно, что полезная информация, о которой вы говорите, находится в err ? Я не понимаю , почему вы хотите, чтобы он был в finally , а не в catch , но если вы это сделаете, просто сохраните его в catch переменной, к которой вы можете получить доступ в finally .

2. @T. J. Crowder ошибка в catch не содержит ответа api. если я смогу обойти это, то ваш метод сработает !

3. Да, это так. (Я только что просмотрел документацию.)

Ответ №1:

Согласно документации, полный ответ доступен в качестве response свойства для ошибки.

Поэтому я бы использовал эту информацию в catch блоке:

 (async() => {
  let apiRes = null;
  try {
    apiRes = await axios.get('https://silex.edgeprop.my/api/v1/a');
  } catch (err) {
    console.error("Error response:");
    console.error(err.response.data);    // ***
    console.error(err.response.status);  // ***
    console.error(err.response.headers); // ***
  } finally {
    console.log(apiRes);
  }
})();
 

Обновленная скрипка

Но если вы хотите finally , чтобы он был вместо этого, просто сохраните его в переменную, которую вы можете там использовать:

 (async() => {
  let apiRes = null;
  try {
    apiRes = await axios.get('https://silex.edgeprop.my/api/v1/a');
  } catch (err) {
    apiRes = err.response;
  } finally {
    console.log(apiRes); // Could be success or error
  }
})();
 

Комментарии:

1. Вы также можете просмотреть определение err типа здесь , чтобы найти другие полезные данные 🙂

Ответ №2:

Согласно документации AXIOS (здесь: https://github.com/axios/axios) вы можете передать validateStatus: false объект конфигурации любому запросу axios.

напр.

 axios.get(url, { validateStatus: false })
axios.post(url, postBody, { validateStatus: false })
 

Вы также можете передать функцию, подобную этой: validateStatus: (status) => status === 200
Согласно документам, поведение по умолчанию-это функция, которая возвращает значение true, если (200 <= статус

Комментарии:

1. Спасибо! использовал это как вариант const options = { method: 'GET', headers: { 'Accept': 'application/json'}, url: 'url, validateStatus: false };

2. Спасибо, сработало как надо.