Javascript 如何从Axios中的http错误中获取状态代码?
这可能看起来很愚蠢,但我试图在Axios中请求失败时获取错误数据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.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
一个JavaScriptError
对象时,你所看到的结果取决于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); });