修改axios的响应拦截器,解决账号密码错误不报错提示问题

本文主要介绍了如何通过修改axios的响应拦截器解决账号密码错误时不显示错误提示的问题,以及处理获取有效数据时的代码冗余。在响应拦截器中根据success字段决定是否抛出错误,并在拦截器中优化数据返回,直接返回data内容,简化业务代码。最终通过验收效果验证了方案的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

  1. 登录时,填写错误的用户名密码,没有错误提示(没有进入catch分支)
  2. 获取ajax的返回结果比较麻烦:res.data.data.XXXX

目标

解决上面的两个问题

解决登录失败不报错的问题

背景知识:如下两种情况axios会主动抛出错误:

  1. 如果本次请求得到的响应的状态码 不是2开头的(如:400,500)
  2. 如果本次请求出现网络错误(如:断网,超时)

当我们提供错误的用户名和密码时,还是能从服务器获得到的数据,这个过程有如下两个特点:

  1. 本次网络请求的状态码是正常的(但是:success字段是false)
  1. 没有网络错误

所以axios并不会主动报错。如下图示

解决思路

在响应拦截器中,根据本次请求返回的数据中的success字段值,来决定是否主动抛出错误。

落地代码

src/utils/request.js中,补充响应拦截器如下:

// 响应拦截器
service.interceptors.response.use(response => {
  
  if (response.data.success) {
    // 操作成功
  } else {
    // 如果success为false 业务出错,直接触发reject 
    // 被catch分支捕获
    return Promise.reject(new Error(response.data.message))
  }
}, error => {
  return Promise.reject(error) // 返回执行错误 让当前的执行链跳出成功 直接进入 catch
})

解决获取有效数据代码冗余的问题

分析

观察api的返回结果,我们发现axios在处理接口返回值时,默认会自动给包裹一个data字段,这导致我们每次在业务模块获取数据都需要写res.data.data.xxxx

这样太麻烦了。

解决思路

在返回有效数据时,直接返回res.data

代码

src/utils/request.js中,对原有的响应拦截器进行修改。具体完成之后的代码如下:

// 响应拦截器
service.interceptors.response.use(response => {
  
  if (response.data.success) {
    // 操作成功
+   return response.data
  } else {
    // 如果success为false 业务出错,直接触发reject 
    // 被catch分支捕获
    return Promise.reject(new Error(response.data.message))
  }
}, error => {
  return Promise.reject(error) // 返回执行错误 让当前的执行链跳出成功 直接进入 catch
})

验收效果

  1. 验收登录成功的情况:再次登陆之后的查看结果,发现打印出来的已经直接是data中的数据了
  1. 验收登录失败的情况:输入一个错误密码,检查是否按照我们的设置显示出错误信息

小结

  1. 响应拦截器用来处理后端接口返回的数据---脱壳处理。
  1. 判断某个操作是否在业务是成功的,需要根据后端接口返回值中某个特殊字段(一般是由后端同学来约定)来判断,而不能只是依靠axios内置的报错机制

### Axios 响应拦截器中的 `Uncaught (in promise)` 错误解决方案 当在 Axios响应拦截器中处理错误时,如果未正确返回一个 Promise 或抛出异常,则可能会遇到 `Uncaught (in promise) Error` 问题。此问题通常发生在未捕获到 Promise 链中的拒绝状态时。 为了有效解决这一问题,可以采取以下方法: #### 正确配置响应拦截器 确保在定义响应拦截器时始终返回一个新的 Promise 并显式地处理错误。以下是实现的一个示例[^3]: ```javascript import axios from 'axios'; const instance = axios.create(); instance.interceptors.response.use( response => { // 对于成功的请求,直接返回数据 return response.data; }, error => { const { response } = error; if (response && response.status === 401) { console.error('Unauthorized access'); } // 返回新的 Promise 并将其标记为 rejected return Promise.reject(error); } ); export default instance; ``` 上述代码片段展示了如何通过 `.use()` 方法设置响应拦截器,并且对于失败的情况,使用 `Promise.reject(error)` 来重新触发 Promise 拒绝链以便上层调用者能够捕捉该错误。 #### 使用全局错误处理器 除了调整响应拦截器外,还可以引入全局错误处理器来统一管理未被捕获的 Promise 错误。这可以通过监听 `window.addEventListener('unhandledrejection', ...)` 实现[^4]: ```javascript window.addEventListener('unhandledrejection', event => { console.error('Unhandled Rejection at:', event.promise, 'reason:', event.reason); }); ``` 这样即使某些地方忘记捕获 Promise 错误,也可以在此处记录日志或者执行其他操作以防止程序崩溃。 #### 调试技巧 如果仍然无法定位具体原因,建议启用浏览器开发者工具查看网络请求详情以及控制台输出信息。此外,在开发阶段开启严格模式可以帮助发现潜在问题所在之处。 --- ### 总结 通过对 Axios 响应拦截器进行适当修改并结合全局错误处理机制,可有效避免因未妥善处理 Promise 导致的运行时错误。务必保证每次错误都得到合理处置,从而维持应用稳定性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值