axios 401 重新发起请求

978 阅读1分钟

401的时候需要重新获取token或者刷新token再继续发起请求

let isRefreshing = false; // 定义一个是否正在刷新token的标记
let retryRequests = []; // 定义一个空数组,承载请求队列
// 系统全局请求对象
const service = axios.create({
  baseURL: window.baseUrl,
  timeout: requestTimeOut,
  responseType: "json",
  withCredentials: true,
});
// ...省略其他代码
service.interceptors.response.use(
  config => {
    // 正常请求
    return config.data;
  },
  error => {
    // 异常请求
    switch (error.response.status) {
      // ...省略其他代码
      case 401:
        if (!isRefreshing) {
          isRefreshing = true; //更新状态
          //发起刷新token
          reLogin().then(res => {
            if (res.errorCode === 0) {
             // token存起来
             sessionStorage.setItem("AuthorizationToken",res.response.token);
              //遍历缓存队列 发起请求 传入最新token
              retryRequests.forEach(cb => cb(res.response.token));
              // 重试完清空这个队列
              retryRequests = [];
              service(error.response.config);
            } else {
              // Toast.fail("登录状态已过期,请重新登录");
              // router.push("/login");
            }
          });
          // 正在刷新token,返回一个未执行resolve的promise
        } else {
          return new Promise(resolve => {
            // 将resolve放进队列,用一个函数形式来保存,等token刷新后调用执行
            retryRequests.push(token => {
              error.response.config.headers.Authorization = token;
              resolve(service(error.response.config));
            });
          });
        }
      break;
      default:
        // Toast.fail("很抱歉,服务连接异常");
      break;
  })

不足之处,恳请大佬指正!