Як я можу отримати код статусу від http-помилки в Axios?


204

Це може здатися дурним, але я намагаюся отримати дані про помилки, коли запит не працює в Axios.

axios.get('foo.com')
    .then((response) => {})
    .catch((error) => {
        console.log(error) //Logs a string: Error: Request failed with status code 404
    })

Чи можна замість рядка отримати об’єкт, мабуть, код статусу та вміст? Наприклад:

Object = {status: 404, reason: 'Not found', body: '404 Not found'}

Відповіді:


371

Те, що ви бачите, це рядок, що повертається toStringметодом errorоб'єкта. ( errorне є рядком.)

Якщо відповідь отримана від сервера, errorоб’єкт буде містити responseвластивість:

axios.get('/foo')
  .catch(function (error) {
    if (error.response) {
      console.log(error.response.data);
      console.log(error.response.status);
      console.log(error.response.headers);
    }
  });

9
Чи можете ви пояснити, що магія за ним автоматично перетворюється на рядок, якщо я не посилаюся на responseвластивість?
Себастьян Олсен

7
console.logвикористовує toStringметод для форматування Errorоб'єктів. Це не має нічого спільного з посиланням на responseмайно.
Нік Уральцев

2
Я все ще розгублений, це специфічно для об'єктів помилок чи? Якщо я console.log об'єкт, я отримую об'єкт, а не рядок.
Себастьян Олсен

3
Це залежить від реалізації. Наприклад, реалізація node.js console.log обробляє Error об'єкти як особливий випадок. Я не можу сказати, як саме вона реалізована в браузерах, але якщо ви зателефонуєте console.log({ foo: 'bar' });і console.log(new Error('foo'));в консоль Chrome DevTools, ви побачите, що результати виглядають по-різному.
Нік Уральцев

5
Має бути тоді рідна річ. Це все ще дивно.
Себастьян Олсен

17

Як сказав @Nick, результати, які ви бачите, коли ви console.logоб’єкт JavaScript, Errorзалежать від точної реалізації console.log, яка змінюється і (imo) робить перевірку помилок неймовірно дратівливими.

Якщо ви хочете побачити повний Errorоб'єкт і всю інформацію, яку він несе в обхід toString()методу, ви можете просто скористатися JSON.stringify :

axios.get('/foo')
  .catch(function (error) {
    console.log(JSON.stringify(error))
  });

8

Я використовую цей перехоплювач, щоб отримати відповідь про помилку.

const HttpClient = axios.create({
  baseURL: env.baseUrl,
});

HttpClient.interceptors.response.use((response) => {
  return response;
}, (error) => {
  return Promise.resolve({ error });
});

6

За допомогою TypeScript можна легко знайти потрібний тип.

import { AxiosResponse, AxiosError } from 'axios'

axios.get('foo.com')
  .then(response: AxiosResponse => {
    // Handle response
  })
  .catch((reason: AxiosError) => {
    if (reason.response!.status === 400) {
      // Handle 400
    } else {
      // Handle else
    }
    console.log(reason.message)
  })

2

Ви можете використовувати оператор розповсюдження ( ...), щоб примусити його до нового об'єкта на зразок цього:

axios.get('foo.com')
    .then((response) => {})
    .catch((error) => {
        console.log({...error}) 
})

Будьте в курсі: це не буде випадком помилки.


1

Це відома помилка, спробуйте використовувати "axios": "0.13.1"

https://github.com/mzabriskie/axios/isissue/378

У мене була така ж проблема, тому я закінчила використання "axios": "0.12.0". Це прекрасно працює для мене.


1
Це не одне і те саме питання, яке я маю, у мене навіть немає жодного об’єкта, коли я реєструюсьerror
Себастьян Олсен

1

Існує нова опція, яка називається validateStatusв конфігурації запиту. Ви можете використовувати його, щоб вказати, щоб не викидати винятки, якщо статус <100 або статус> 300 (поведінка за замовчуванням). Приклад:

const {status} = axios.get('foo.com', {validateStatus: () => true})

0

Ви можете помістити помилку в об'єкт і записати об'єкт таким чином:

axios.get('foo.com')
    .then((response) => {})
    .catch((error) => {
        console.log({error}) // this will log an empty object with an error property
    });

Сподіваюся, це допоможе комусь там.


0

Щоб повернути код статусу http з сервера, ви можете додати validateStatus: status => trueдо параметрів axios:

axios({
    method: 'POST',
    url: 'http://localhost:3001/users/login',
    data: { username, password },
    validateStatus: () => true
}).then(res => {
    console.log(res.status);
});

Таким чином, кожна відповідь http вирішує обіцянку, повернуту з аксіосів.

https://github.com/axios/axios#handling-errors


0

Це мій код: працюй для мене

 var jsonData = request.body;
    var jsonParsed = JSON.parse(JSON.stringify(jsonData));

    // message_body = {
    //   "phone": "5511995001920",
    //   "body": "WhatsApp API on chat-api.com works good"
    // }

    axios.post(whatsapp_url, jsonParsed,validateStatus = true)
    .then((res) => {
      // console.log(`statusCode: ${res.statusCode}`)

            console.log(res.data)
        console.log(res.status);

        // var jsonData = res.body;
        // var jsonParsed = JSON.parse(JSON.stringify(jsonData));

        response.json("ok")
    })
    .catch((error) => {
      console.error(error)
        response.json("error")
    })
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.