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

Seb*_*sen 135 javascript axios

这可能看起来很愚蠢,但是当Axios中的请求失败时,我正试图获取错误数据.

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

而不是字符串,是否可以获得具有状态代码和内容的对象?例如:

Object = {status: 404, reason: 'Not found', body: '404 Not found'}
Run Code Online (Sandbox Code Playgroud)

Nic*_*sev 242

你看到的是对象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);
    }
  });
Run Code Online (Sandbox Code Playgroud)

  • `console.log`使用`toString`方法格式化`Error`对象.它与引用`response`属性无关. (7认同)
  • 如果我不引用`response`属性,你能解释它背后的魔法自动变成一个字符串吗? (6认同)
  • 这取决于实施。例如,node.js 实现 `console.log` [handles](https://github.com/nodejs/node/blob/master/lib/util.js#L430) `Error` 对象作为一个特例。我不能说它在浏览器中是如何实现的,但是如果你在 Chrome DevTools 控制台中调用 `console.log({ foo: 'bar' });` 和 `console.log(new Error('foo'));` ,您会看到结果看起来不同。 (6认同)
  • 我仍然很困惑,这是特定于错误对象还是?如果我 console.log 一个对象,我会得到这个对象,而不是一个字符串。 (5认同)
  • 像 404 这样的错误呢?在这种情况下,响应是未定义的。 (3认同)
  • 迟到了,但 FWIW `console.dir` 将打印对象及其属性 (3认同)
  • 那必须是本土的东西.但它仍然很奇怪. (2认同)
  • 对于 401 错误,响应属性是“未定义”。 (2认同)
  • 您可以在 Chrome 中执行 `console.dir` 而不是 `console.log` 来查看错误的“内部”结构。这与 DOM 元素使用的技巧相同——它将所有内容显示为对象,而不是“快速而漂亮”(但有时会产生误导)的表示形式。 (2认同)

Yan*_*ong 27

使用 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)
  })
Run Code Online (Sandbox Code Playgroud)

  • 为了这种清晰度,我正在尝试让我的团队改用 Typescript。 (3认同)

dan*_*nii 13

正如@Nick所说,当你使用console.log一个JavaScript Error对象时,你看到的结果取决于它的确切实现console.log,这种结果会有所不同,并且(imo)会使检查错误变得异常烦人.

如果您希望看到完整Error对象及其绕过该toString()方法的所有信息,您可以使用JSON.stringify:

axios.get('/foo')
  .catch(function (error) {
    console.log(JSON.stringify(error))
  });
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,“JSON.stringify(error)”是抛出“循环依赖”错误的潜在候选者。 (2认同)

小智 11

validateStatus请求配置中有一个新选项。如果状态 < 100 或状态 > 300(默认行为),您可以使用它来指定不抛出异常。例子:

const {status} = axios.get('foo.com', {validateStatus: () => true})
Run Code Online (Sandbox Code Playgroud)


Emr*_*pcı 10

为了获取服务器返回的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);
});
Run Code Online (Sandbox Code Playgroud)

这样,每个 http 响应都会解析从 axios 返回的 Promise。

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


小智 9

整个错误只能使用 error.response 来显示,如下所示:

axios.get('url').catch((error) => {
      if (error.response) {
        console.log(error.response);
      }
    });
Run Code Online (Sandbox Code Playgroud)


Mos*_*rtz 8

您可以使用扩展运算符 ( ...) 将其强制转换为一个新对象,如下所示:

axios.get('foo.com')
    .then((response) => {})
    .catch((error) => {
        console.log({...error}) 
})
Run Code Online (Sandbox Code Playgroud)

请注意:这不会是 Error 的实例。


小智 7

我正在使用此拦截器来获取错误响应。

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

HttpClient.interceptors.response.use((response) => {
  return response;
}, (error) => {
  return Promise.resolve({ error });
});
Run Code Online (Sandbox Code Playgroud)


小智 7

const handleSubmit = (e) => {
e.preventDefault();
// console.log(name);
setLoading(true);
createCategory({ name }, user.token)
  .then((res) => {
   // console.log("res",res);
    setLoading(false);
    setName("");
    toast.success(`"${res.data.name}" is created`);
    loadCategories();
  })
  .catch((err) => {
    console.log(err);
    setLoading(false);
    if (err.response.status === 400) toast.error(err.response.data);//explained in GD
  });
Run Code Online (Sandbox Code Playgroud)

};

看控制台日志就明白了

在此输入图像描述