Axios HTTP请求始终判定为成功,无法捕获503错误状态的问题
解决Axios请求返回503却进入成功回调的问题
看起来你遇到了个有点反直觉的问题——明明接口返回了503状态码,Axios却跑到then()里而不是catch()。别担心,这种情况大多和Axios的错误判断规则有关,咱们一步步排查解决:
先搞懂Axios的默认错误判定逻辑
Axios默认只会把状态码不在200-299范围内的请求判定为错误,触发catch()回调。但如果你的axiosConfig里修改了validateStatus配置项,这个规则就会被打破。比如要是有人把它改成了这样:
const axiosConfig = { // 其他配置... validateStatus: (status) => true // 强制所有状态码都视为成功 };
那不管服务器返回503、404还是500,请求都会乖乖进入then()。
解决方案1:检查并修正validateStatus配置
先确认你的axiosConfig里有没有自定义validateStatus。如果有,把它改回默认规则就行:
const axiosConfig = { // 其他配置... validateStatus: (status) => status >= 200 && status < 300 };
要是不需要自定义这个规则,直接删掉该配置项,Axios会自动用默认值。
如果配置没问题,手动在then()里校验状态码
有时候可能因为代理、CORS设置或者服务器响应的特殊情况,Axios没能正确识别错误状态码。这时候可以在成功回调里主动检查状态,把异常抛给catch()处理:
getData() { axios.get(`/api/article/getObserved.php`, axiosConfig) .then(response => { // 先判断状态码是否异常 if (response.status >= 400) { throw new Error(`请求失败,状态码:${response.status}`); } console.log('success'); console.log(response); }) .catch(err => { console.log('error'); // 这里可以正常获取状态码了 console.log(err.response?.status || err.message); }); }
这样哪怕Axios误判了成功,咱们也能手动把异常流转到catch()里。
额外提醒:确认实际响应状态
打开浏览器的Network面板,找到这个请求,确认服务器真的返回了503状态码。有时候可能存在缓存、代理重定向的情况,实际到达浏览器的状态码和服务器设置的不一样——比如有些代理会把503转换成200,这时候Axios自然会进入then()。
内容的提问来源于stack exchange,提问作者BT101
相关产品推荐
相关产品推荐

