You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中Axios拦截器刷新Token后如何续接组件原有请求流程?

解决Axios拦截器刷新Token后重发请求的Promise链式问题

你的问题核心是拦截器里的401处理逻辑没有正确返回Promise链,导致原请求直接进入catch分支,没有等待重发请求的结果。只需要修改拦截器代码,把刷新Token并重发请求的Promise链返回即可。

修改后的拦截器代码

privateAxios.interceptors.response.use(
  (response) => {
    return response;
  },
  (error) => {
    const { config, response } = error;
    const originalRequest = config;
    if (response?.status === 401) {
      // 关键:return这个Promise链,让原请求的Promise等待它完成
      return apiProvider
        .refreshToken()
        .then(() => {
          let headers = getAuthHeaders();
          privateAxios.defaults.headers = headers;
          originalRequest.headers = headers;
          return privateAxios(originalRequest);
        })
        .catch((err) => {
          logout();
          return Promise.reject(err);
        });
    }
    return Promise.reject(error);
  }
);

为什么这样改?

原来的代码在401分支里没有return apiProvider.refreshToken()的Promise链,导致拦截器直接执行了return Promise.reject(error),原请求的Promise就进入了catch。

现在return这个Promise链后:

  • 如果刷新Token成功并重发请求,privateAxios(originalRequest)会返回新的响应Promise,这个响应会传递给组件请求的then分支,组件里的showSuccessFeedbackForm()、reloadTable()、handleClose()就会正常执行;
  • 如果刷新Token失败,catch分支会logout并把错误抛出,组件的catch分支会接收到错误,执行对应的告警逻辑。

组件代码无需修改

你现有的组件请求代码完全不用改,拦截器会自动把重发请求的响应传递给then分支,触发后续的成功流程。

内容的提问来源于stack exchange,提问作者Murilo Sitonio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:10:14