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

IT技术 javascript axios
2021-01-28 04:38:18

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

你看到的是对象toString方法返回的字符串errorerror不是字符串。)

如果已收到来自服务器的响应,则该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);
    }
  });
那一定是土生土长的东西。不过还是很奇怪。
2021-03-15 04:38:18
console.log使用toString方法格式化Error对象。它与引用response财产无关
2021-03-23 04:38:18
我仍然很困惑,这是特定于错误对象还是?如果我 console.log 一个对象,我会得到这个对象,而不是一个字符串。
2021-04-05 04:38:18
这取决于实施。例如,Node.js的实施console.log 手柄 Error对象作为一种特殊情况。我不能说它在浏览器中是如何实现的,但是如果你在 Chrome DevTools 控制台中调用console.log({ foo: 'bar' });console.log(new Error('foo'));,你会看到结果看起来不同。
2021-04-09 04:38:18
如果我不引用response属性,你能解释它背后的魔法自动变成字符串吗?
2021-04-11 04:38:18

使用 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)
  })

此外,您可以将参数传递给这两种类型,以告诉您在内部期望什么,response.data如下所示:

import { AxiosResponse, AxiosError } from 'axios'
axios.get('foo.com')
  .then((response: AxiosResponse<{user:{name:string}}>) => {
    // Handle response
  })
  .catch((reason: AxiosError<{additionalInfo:string}>) => {
    if (reason.response!.status === 400) {
      // Handle 400
    } else {
      // Handle else
    }
    console.log(reason.message)
  })
我正试图让我的团队切换到 Typescript 以获得这种清晰度。
2021-03-25 04:38:18
这使一切变得更容易,因为您可以使用智能感知获取类型的所有属性,因此您可以了解响应和错误的正确结构
2021-04-12 04:38:18

正如@Nick 所说,您console.log在 JavaScriptError对象时看到的结果取决于 的确切实现console.log,这会有所不同,并且 (imo) 使检查错误变得非常烦人。

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

axios.get('/foo')
  .catch(function (error) {
    console.log(JSON.stringify(error))
  });
JSON.stringify(error)Circular dependency在这种情况下是抛出错误的潜在候选者
2021-03-23 04:38:18
目前,这不起作用。它不显示 error.response 中的内容。
2021-04-04 04:38:18

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

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

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

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

HttpClient.interceptors.response.use((response) => {
  return response;
}, (error) => {
  return Promise.resolve({ error });
});
您可以在它们被 then 或 catch 处理之前拦截请求或响应。
2021-03-16 04:38:18
使用拦截器的具体优势是什么?
2021-03-23 04:38:18