最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

请求的 Axios 拦截器在继续请求之前不等待等待函数调用完成

网站源码admin44浏览0评论

请求的 Axios 拦截器在继续请求之前不等待等待函数调用完成

请求的 Axios 拦截器在继续请求之前不等待等待函数调用完成

我有使用 Axios 发出的所有请求的拦截器代码。

instance
这里是 Axios 实例。

instance.interceptors.request.use(async (config) => {
  const tokens = JSON.parse(localStorage.getItem('users'));
  if (!tokens) {
    return config;
  }
  const accessTokenValid = Date.now() <= (tokens?.expirationTime ?? Date.now());
  if (accessTokenValid) {
    return config;
  }
  const refreshToken = tokens.refreshToken;
  if (!refreshToken) { 
    return config;
  }

  const response = await fetch(`${some-endpoint}/auth/refresh/token?token=${refreshToken}`);
  const newTokens = (await response.json()).data.data;

  localStorage.setItem('users', JSON.stringify(
    {
      accessToken: newTokens.access_token,
      expirationTime: Date.now() + parseInt(JSON.parse(newTokens.expires_in)) * 1000 - 600 * 1000,
      refreshToken: newTokens.refresh_token,
    }
  ));

  config.headers.Authorization = `Bearer ${newTokens.access_token}`;

  return config;
}, (error) => {
  console.error(error);
});

那么,

instance
就这样用了

    return instance.get(
      "/users/" + id,
      options
    );

在哪里

options
看起来像这样。

        {
          headers: {
            Authorization: `Bearer ${session.accessToken}`,
          },
        }

上面代码的问题是token过期后第一次请求总是会失败。然后,

localStorage.users
中的值将被更新,第二个请求将成功,因为该值已被新的访问令牌替换。

我不想使用拦截器来响应重试原始请求。我想根据要求处理令牌刷新。经过调查发现 HTTP 请求发生的顺序如下。

  • 对端点的 HTTP 请求
    users
  • 然后,HTTP 请求到端点以刷新令牌

这告诉我请求拦截器中的

async/await
部分不起作用。我怎样才能让 HTTP 请求在运行 HTTP 请求本身之前必须先等待拦截器完成运行(包括等待任何异步函数)?

回答如下:
发布评论

评论列表(0)

  1. 暂无评论