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

Javascript 如何从Axios中的http错误中获取状态代码?,javascript,axios,Javascript,Axios,这可能看起来很愚蠢,但我试图在Axios中请求失败时获取错误数据 axios.get('foo.com') .then((response) => {}) .catch((error) => { console.log(error) //Logs a string: Error: Request failed with status code 404 }) 是否可以获取一个可能包含状态代码和内容的对象,而不是字符串?例如: Object =

这可能看起来很愚蠢,但我试图在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'}

这是一个已知错误,请尝试使用“axios”:“0.13.1”


我也遇到了同样的问题,所以我最终使用了
“axios”:“0.12.0”
。它对我来说很好。

您看到的是
error
对象的
toString
方法返回的字符串。(
错误
不是字符串。)

如果从服务器收到响应,则
错误
对象将包含
响应
属性:

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

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

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

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

正如@Nick所说,当你
console.log
一个JavaScript
Error
对象时,你所看到的结果取决于
console.log
的具体实现,这会发生变化,而且(imo)会让检查错误变得非常烦人

如果希望绕过
toString()
方法查看完整的
错误
对象及其携带的所有信息,可以使用:


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

您可以使用扩展操作符(
)将其强制到新对象中,如下所示:

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

请注意:这不会是错误实例。

您可以将错误放入对象并记录该对象,如下所示:

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

希望这对其他人有所帮助。

在请求配置中有一个名为
validateStatus
的新选项。您可以使用它指定在状态<100或状态>300时不引发异常(默认行为)。例如:

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

为了获取从服务器返回的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返回的承诺


这是我的密码:为我工作

 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")
    })

仅获取错误并没有返回对象,这确实非常奇怪。返回时出现错误。通过“响应”可以访问您需要的大多数反馈信息

我最后用了这个:

axios.get(...).catch( error => { return Promise.reject(error.response.data.error); });

它严格地提供了我需要的东西:状态代码(404)和错误的文本消息。

这与我遇到的问题不同,当我记录
error
时,甚至没有涉及对象。如果我不参考
response
属性,你能解释一下它自动变成字符串的神奇之处吗?
控制台。log
使用
toString
方法格式化
error
对象。它与引用
response
属性无关。我仍然很困惑,这是针对错误对象还是对象的?如果我console.log一个对象,我得到的是对象,而不是字符串。这取决于实现。例如,
console.log
Error
对象的node.js实现就是一个特例。我不能说它在浏览器中是如何实现的,但是如果调用
console.log({foo:'bar})
控制台.log(新错误('foo')
在ChromeDevTools控制台中,您将看到结果看起来不同。那么一定是本机结果。但这仍然很奇怪。我正试图让我的团队切换到Typescript以获得这种清晰性。虽然这段代码可能提供了一个问题的解决方案,但最好添加上下文来说明它为什么/如何工作。这可以帮助未来的用户学习,并将这些知识应用到他们自己的代码中。在解释代码时,用户也可能会以投票的形式向您提供正面反馈。使用拦截器的具体优势是什么?您可以在处理请求或响应之前拦截它们或捕获它们。快速控制台日志的好答案。
Axios. get('foo.com')
.then((response) => {})
.catch((error) => {
    if(error. response){
       console.log(error. response. data)
       console.log(error. response. status);

      }
})
axios.get(...).catch( error => { return Promise.reject(error.response.data.error); });