axios拦截响应报错

在基于Promise的HTTP客户端中,axios是一个广泛使用的库,它提供了一种简洁明了的方式来发送异步HTTP请求到REST端点,在使用axios时,我们经常需要对请求和响应进行拦截,以便于统一处理一些逻辑,例如认证失效、接口报错、请求重定向等,以下将详细讨论如何使用axios的响应拦截器来处理报错。

axios拦截响应报错
(图片来源网络,侵删)

我们需要设置axios的响应拦截器,响应拦截器允许我们在请求得到响应后,对响应数据进行处理或修改,这非常实用,因为我们可以在这里检查HTTP状态码,并根据需要处理业务逻辑错误。

// 创建axios实例
const service = axios.create({
  // axios 配置项
});
// 响应拦截器
service.interceptors.response.use(
  response => {
    // 对响应数据做点什么
    const res = response.data;
    // 这里可以根据后端接口返回数据的结构进行判断
    if (res.code !== 200) {
      // 业务逻辑错误处理
      // 可以根据实际情况,做弹出提示,或者其他的错误处理逻辑
      Message({
        message: res.message || 'Error',
        type: 'error',
        duration: 5 * 1000
      });
      // 如果是业务错误,我们返回一个Promise.reject,这样可以在后续的.catch中捕获
      return Promise.reject(new Error(res.message || 'Error'));
    } else {
      // 业务成功,返回response对象
      return response;
    }
  },
  error => {
    // 对响应错误做点什么
    if (error.response) {
      // 请求已发出,但服务器响应的状态码不在2xx的范围
      const res = error.response.data;
      Message({
        message: res.message || 'Error',
        type: 'error',
        duration: 5 * 1000
      });
    } else if (error.request) {
      // 请求已经发出了,但是没有收到响应
      Message({
        message: 'Network Error',
        type: 'error',
        duration: 5 * 1000
      });
    } else {
      // 发送请求时出了点问题
      Message({
        message: error.message || 'Request Error',
        type: 'error',
        duration: 5 * 1000
      });
    }
    // 我们返回一个Promise.reject,这样可以在后续的.catch中捕获
    return Promise.reject(error);
  }
);

在上述代码中,我们首先创建了一个axios实例并为其添加了响应拦截器,拦截器由两部分组成:一个是处理正常响应的回调,另一个是处理异常的回调。

当接口返回的业务状态码不是我们预定的成功状态码时,我们会在第一个回调函数中处理这种情况,通常,后端服务会返回一个包含业务错误信息的JSON对象,我们会弹出错误信息,并调用Promise.reject()来拒绝这个Promise,使得后续的.then()不会被执行,而是直接跳转到.catch()中去。

对于异常处理,我们检查error.response是否存在来区分错误类型,如果error.response存在,说明请求已发出且服务器有响应,但状态码不是2xx,这时我们可以根据服务器返回的错误信息进行提示,如果不存在,可能是请求发出前发生了错误,例如网络问题,或者是请求配置不正确。

特别需要注意的是,当token失效时,可能会在一次用户操作中引发多个请求失败,导致多次弹出错误提示,这会影响用户体验,为了解决这个问题,我们可以设置一个全局变量来控制提示只弹出一次。

let hasTokenErrorShown = false;
// 部分异常处理代码
if (error.response && error.response.status === 401 && !hasTokenErrorShown) {
  hasTokenErrorShown = true;
  Message({
    message: 'Token expired, please login again',
    type: 'error',
    duration: 5 * 1000
  });
}

通过上述机制,我们不仅统一了错误处理的方式,而且避免了因为重复错误导致的频繁提示,提升了用户界面的友好性。

为了避免在拦截器中由于编程疏忽导致的问题,比如在响应拦截器中忘记返回response对象,我们需要仔细检查拦截器的逻辑,确保任何情况下,use函数中的两个回调都正确返回了Promise对象。

使用axios的拦截器可以有效地对HTTP请求进行监控和管理,它为我们提供了一个强大的机制来处理API调用过程中可能出现的各种情况,从而增强应用的可维护性和用户体验。

原创文章,作者:酷盾叔,如若转载,请注明出处:https://www.kdun.com/ask/384955.html

本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。

(0)
酷盾叔的头像酷盾叔订阅
上一篇 2024-03-25 12:53
下一篇 2024-03-25 12:55

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

产品购买 QQ咨询 微信咨询 SEO优化
分享本页
返回顶部
云产品限时秒杀。精选云产品高防服务器,20M大带宽限量抢购 >>点击进入