前端刷新token, 继续之前请求,调取接口返回数据。

发布于 2022-09-12 04:40:00 字数 2333 浏览 14 评论 0

封装了ajax请求, 有单独api模块, 如果token过期, 从新刷新token,继续之前的请求,但继续之前的请求,拿不到接口的返回值;如何解决。求大神

`import {domain} from './config'
let isRefreshing = true
let refreshLoginUrls = []
const wxRequest = (params = {}, url) => {
  let token = dd.getStorageSync({key: 'token'}) ? 'Bearer ' + dd.getStorageSync({key: 'token'}).data : ''
 let data = params.query || {}
  return new Promise(async (resolve, reject) => {
    await dd.httpRequest({
      url: domain + url,
 method: params.method || 'GET',
 data: JSON.stringify(data),
 headers: {
        "Content-Type": "application/json",
 Authorization: token
      },
 dataType: 'json',
 success:async sucInfo => {
        if (sucInfo.data && sucInfo.data.resultCode == 401) {
          refreshLoginUrls.push({params: params, url:url})
          if (isRefreshing) {
            isRefreshing = false
 await refreshToken()
          }
          return resolve(sucInfo.data)
        } else {
          return resolve(sucInfo.data)
        }
      },
 fail: failInfo => {
        return reject(failInfo)
      },
 })
  })
}
const refreshToken = () => {
    return new Promise((resolve, reject) => {
      dd.getAuthCode({
        success: loginCode => {
          if (loginCode.authCode) {
            wxPost({query: {code: loginCode.authCode}}, '/api/frontend/login').then(loginInfo => {
              if (loginInfo.resultCode == 200) {
                dd.setStorage({
                  key: "token",
 data: loginInfo.data.access_token,
 success: () => {
                    dd.setStorageSync({key: 'userInfo', data:loginInfo.data.user_info })
                    refreshLoginUrls.forEach(item => {
                      wxPost(item.params, item.url).then(res => {
                        return resolve(res.data)
                      })
                    })
                    refreshLoginUrls = []
                  }
                })
              } else {
                return reject(loginInfo.data)
              }
            })
          }
        }
      })
    })
}
const wxGet = async (params = {}, url) => {
  params.method = 'GET'
 return wxRequest(params, url)
}
const wxPost = async (params = {}, url) => {
  params.method = 'POST'
 return wxRequest(params, url)
}
module.exports = {
  wxRequest, wxGet, wxPost
}``

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

那伤。 2022-09-19 04:40:00

我项目里面刷新token是这样处理的,你看看这样能解决你的问题吗?

const createAxiosResponseInterceptor = () => {
  const axiosResponseInterceptor = axiosInstance.interceptors.response.use(
    (response) => {
      if (response.status >= 200 && response.status < 300) {
        if (response.data.code == 0) {
          return response.data.data;
        } else {
          throw new Error(response.data.msg);
        }
      }
      throw new Error("服务器正在维护中...");
    },
    async (error) => {
      console.error(error);
      if (!error || !error.response) {
        return Promise.reject(new Error("网络连接超时"));
      }
      let errorResponse = error.response;
      if (errorResponse.status === 401) {
        axiosInstance.interceptors.response.eject(axiosResponseInterceptor);
        // 重点代码在这里
        try {
          const response = await refreshToken();
          saveToken(response.data);
          errorResponse.config.headers["authorization"] =
            "Bearer " + response.data.access_token;
          return axiosInstance(errorResponse.config);
        } catch (error) {
          cleanToken();
          window.location.href =
            window.location.origin + "/index.html#/user/login";
          window.location.search = `?vwind=${Date.now()}`;
          return Promise.reject(new Error("登录失效,请重新登录"));
        } finally {
          createAxiosResponseInterceptor();
        }
      } else if (errorResponse.status === 500) {
        axiosInstance.interceptors.response.eject(axiosResponseInterceptor);
        try {
          const msg = errorResponse.data.msg;
          return Promise.reject(new Error(msg));
        } catch (error) {
          return Promise.reject(error);
        } finally {
          createAxiosResponseInterceptor();
        }
      } else {
        return Promise.reject(error);
      }
    }
  );
};
createAxiosResponseInterceptor();
桃气十足 2022-09-19 04:40:00

image.png
那就在你这个判断里面再掉你的方法

wxRequest()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文