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

如何在RTK Query的prepareHeaders中更新状态变量?

在RTK Query的prepareHeaders中更新过期Token的解决方案

首先明确:prepareHeaders 本身是同步逻辑,设计上就不提供 dispatch,你不能在这里直接做异步的token刷新和状态更新操作,强行写await还会报错。

正确的做法是自定义带重鉴权逻辑的baseQuery,RTK Query允许你包装fetchBaseQuery,自定义的baseQuery能拿到完整的api对象(包含dispatch和getState),具体步骤如下:

  1. 先定义基础的fetchBaseQuery配置,再写一个包装函数处理token刷新逻辑
  2. 在包装函数里检查请求是否因token过期失败(比如后端返回401状态码)
  3. 刷新token后用api.dispatch更新Redux状态,再重试原请求

完整代码示例:

import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
import { setNewToken } from './authSlice'; // 导入你的auth slice对应的action

// 基础的fetchBaseQuery配置
const baseQuery = fetchBaseQuery({ baseUrl: '/' });

// 带重鉴权逻辑的自定义baseQuery
const baseQueryWithReauth = async (args, api, extraOptions) => {
  let response = await baseQuery(args, api, extraOptions);

  // 这里假设token过期会返回401,根据你的后端实际情况调整判断逻辑
  if (response.error && response.error.status === 401) {
    try {
      // 请求新的token
      const refreshResponse = await fetch('/token_store');
      const newTokenData = await refreshResponse.json();

      // 更新Redux中的token状态
      api.dispatch(setNewToken(newTokenData));

      // 重新发起原请求,此时新token已存入state
      response = await baseQuery(args, api, extraOptions);
    } catch (err) {
      console.error('刷新token失败:', err);
    }
  }

  return response;
};

// 创建API实例
export const baseApi = createApi({
  reducerPath: 'baseApi',
  baseQuery: baseQueryWithReauth, // 使用自定义的baseQuery
  endpoints: () => ({}),
});

额外补充两点注意事项:

  • 原代码里在prepareHeaders中使用await是错误的,这个函数是同步执行的,不能放置异步逻辑
  • 不要在prepareHeaders里主动检查token过期时间,更好的方式是等后端返回401再处理,避免前端与后端时间不一致导致的误判

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:10:31