如何从 Axios 中的 HTTP 错误获取状态码?
How can I get the status code from an HTTP error in Axios?
这可能看起来很愚蠢,但我正在尝试在 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"
https://github.com/mzabriskie/axios/issues/378
我遇到了同样的问题,所以我最终使用了 "axios": "0.12.0"
。它对我来说很好用。
你看到的是error
对象的toString
方法返回的字符串。 (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);
}
});
我正在使用这个拦截器来获取错误响应。
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 ) 使检查错误变得非常烦人。
如果您想查看完整的 Error
对象及其绕过 toString()
方法携带的所有信息,您可以只使用 JSON.stringify:
axios.get('/foo')
.catch(function (error) {
console.log(JSON.stringify(error))
});
使用 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)
})
您可以使用扩展运算符 (...
) 将其强制转换为新对象,如下所示:
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
的新选项。如果 status < 100 或 status > 300(默认行为),您可以使用它来指定不抛出异常。示例:
const {status} = axios.get('foo.com', {validateStatus: () => true})
为了获取服务器返回的http状态码,可以在axios选项中添加validateStatus: status => true
:
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('foo.com')
.then((response) => {})
.catch((error) => {
if(error. response){
console.log(error. response. data)
console.log(error. response. status);
}
})
仅获取 error 而不是 return 对象确实很奇怪。虽然 returning error.response 让您可以访问您需要的大多数反馈资料。
我最终使用了这个:
axios.get(...).catch( error => { return Promise.reject(error.response.data.error); });
它严格地给出了我需要的东西:状态代码 (404) 和错误的文本消息。
整个错误只能使用 error.response 显示:
axios.get('url').catch((error) => {
if (error.response) {
console.log(error.response);
}
});
使用 Axios
post('/stores', body).then((res) => {
notifyInfo("Store Created Successfully")
GetStore()
}).catch(function (error) {
if (error.status === 409) {
notifyError("Duplicate Location ID, Please Add another one")
} else {
notifyError(error.data.detail)
}
})
这可能看起来很愚蠢,但我正在尝试在 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"
https://github.com/mzabriskie/axios/issues/378
我遇到了同样的问题,所以我最终使用了 "axios": "0.12.0"
。它对我来说很好用。
你看到的是error
对象的toString
方法返回的字符串。 (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);
}
});
我正在使用这个拦截器来获取错误响应。
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 ) 使检查错误变得非常烦人。
如果您想查看完整的 Error
对象及其绕过 toString()
方法携带的所有信息,您可以只使用 JSON.stringify:
axios.get('/foo')
.catch(function (error) {
console.log(JSON.stringify(error))
});
使用 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)
})
您可以使用扩展运算符 (...
) 将其强制转换为新对象,如下所示:
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
的新选项。如果 status < 100 或 status > 300(默认行为),您可以使用它来指定不抛出异常。示例:
const {status} = axios.get('foo.com', {validateStatus: () => true})
为了获取服务器返回的http状态码,可以在axios选项中添加validateStatus: status => true
:
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('foo.com')
.then((response) => {})
.catch((error) => {
if(error. response){
console.log(error. response. data)
console.log(error. response. status);
}
})
仅获取 error 而不是 return 对象确实很奇怪。虽然 returning error.response 让您可以访问您需要的大多数反馈资料。
我最终使用了这个:
axios.get(...).catch( error => { return Promise.reject(error.response.data.error); });
它严格地给出了我需要的东西:状态代码 (404) 和错误的文本消息。
整个错误只能使用 error.response 显示:
axios.get('url').catch((error) => {
if (error.response) {
console.log(error.response);
}
});
使用 Axios
post('/stores', body).then((res) => {
notifyInfo("Store Created Successfully")
GetStore()
}).catch(function (error) {
if (error.status === 409) {
notifyError("Duplicate Location ID, Please Add another one")
} else {
notifyError(error.data.detail)
}
})