Axios: что делать, если что-то пошло не так
3 февраля 2023 г.Если вы ищете библиотеки для вызовов API из Node.js, скорее всего, вы наткнетесь на пакет Axios. Он прост в использовании, хорошо документирован, использует обещания и работает в браузерах.
Когда что-то идет не так
Основная претензия от других разработчиков заключается в том, что когда они делают запрос и возвращается ответ об ошибке, не очевидно, как получить информацию об ошибке. Обычно это происходит, когда они не перехватывают исключение и ожидают, что ответ будет содержать код состояния.
const response = await axios.get(SOME_URL);
if(response.status === 404) {
console.error(`${SOME_URL} not found!`);
}
Этот подход не будет работать, поскольку Axios по умолчанию выдает исключение для любого состояния. код, отличный от 2xx. Однако есть обходной путь.
Сделайте его более отзывчивым
Вы можете указать Axios, что хотите видеть каждый ответ, независимо от того, является ли он ошибкой или не использует параметры запроса. Вам необходимо предоставить метод validateStatus
, который всегда возвращает true
. Этот метод передается в Axios в параметрах запроса.
const response = await axios.get(SOME_URL, {
validateStatus: () => true,
});
if(response.status === 404) {
console.error(`${SOME_URL} not found!`);
}
Теперь вы дойдете до оператора if, как и ожидалось.
Есть .catch()
Если вы посмотрите на документацию Axios по обработке ошибок, вы должны поймать исключение, которое оно генерирует. Вы можете использовать свойство response
для исключения, чтобы определить, какой статус был возвращен. Наконец, вы можете изящно вернуть некоторое значение и продолжить работу.
const contents = await axios.get(SOME_URL)
.then((response) => response.data)
.catch((error) => {
if(error.response?.status === 404) {
console.error(`Could not find ${SOME_URL}`, response.data);
return undefined;
}
// Something unexpected
throw error;
});
if(!contents) return;
Обзор
Вы познакомились с несколькими способами обработки ответов об ошибках при совершении HTTP-вызовов с помощью Axios.
Важно помнить, что он выдаст ошибку для ответов, отличных от 2xx, а свойство response
в выброшенном исключении будет содержать все данные, которые вы обычно возвращаете (статус, тело, и др.).
Оригинал