如何从Axios中的http错误获取状态代码?


200

这看起来可能很愚蠢,但是当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'}

Answers:


361

您将看到对象的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
这取决于实现。例如,作为特殊情况,console.log 处理 Error对象的node.js实现。我不能说这是究竟如何在浏览器中实现,但如果你打电话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}) 
})

请注意:这将不是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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.