service.js中axios请求422错误进入成功回调无法捕获如何解决
问题根因
该异常是axios实例配置错误导致的,和service层封装、视图层调用的写法无关。axios默认会将200-299区间外的HTTP状态码判定为请求失败,自动进入Promise的reject分支(即catch回调),所有响应都进入then链只有两种可能:
- 响应拦截器的错误处理分支没有抛出异常,直接把错误对象作为正常结果返回,将原本的reject状态改成了resolve
- 初始化axios实例时自定义了
validateStatus配置,规则设置为所有状态码都判定为请求成功
修复步骤
- 定位
apiService实例的初始化代码,检查响应拦截器逻辑
错误的拦截器写法会直接return错误响应,导致异常不抛出:
将错误分支修改为抛出异常即可:// 错误示例 apiService.interceptors.response.use( (response) => response.data, (error) => { // 错误点:直接return错误响应,没有抛出异常 return error.response } )// 修复后 apiService.interceptors.response.use( (response) => response.data, (error) => { // 两种写法二选一即可,效果一致 return Promise.reject(error) // throw error } ) - 检查axios实例的
validateStatus配置
如果配置了类似validateStatus: () => true的规则,会导致所有状态码都被判定为成功。如果要保持默认的错误判定逻辑,可直接删除该配置,或显式写为:const apiService = axios.create({ baseURL: '你的接口前缀地址', // 仅2xx状态码判定为请求成功 validateStatus: (status) => status >= 200 && status < 300 })
说明
你当前service层的封装代码、视图层的调用写法本身没有语法问题,不需要修改,修复完axios实例配置后,422等非2xx响应就会正常进入catch分支。
内容的提问来源于stack exchange,提问作者yigitozmen
相关产品推荐
相关产品推荐

