Как я могу получить код состояния из-за ошибки 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собственность.
Николай Уральцев
3
Я все еще в замешательстве, это характерно для объектов ошибок или? Если я console.log объекта, я получаю объект, а не строку.
Себастьян Олсен
3
Это зависит от реализации. Например, реализация node.js console.log обрабатывает Error объекты как особый случай. Я не могу сказать, как именно это реализовано в браузерах, но если вы позвоните console.log({ foo: 'bar' });и console.log(new Error('foo'));в консоли Chrome DevTools, вы увидите, что результаты выглядят иначе.
Николай Уральцев
5
Должно быть, это родная вещь тогда. Это все еще странно, хотя.
Себастьян Олсен
17

Как сказал @Nick, результаты, которые вы видите, когда вы console.logJavaScript- 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/issues/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-ответ разрешает обещание, возвращаемое Axios.

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")
    })
Родриго Гросси
источник