如何在RTK Query的prepareHeaders中更新状态变量?
在RTK Query的prepareHeaders中更新过期Token的解决方案
首先明确:prepareHeaders 本身是同步逻辑,设计上就不提供 dispatch,你不能在这里直接做异步的token刷新和状态更新操作,强行写await还会报错。
正确的做法是自定义带重鉴权逻辑的baseQuery,RTK Query允许你包装fetchBaseQuery,自定义的baseQuery能拿到完整的api对象(包含dispatch和getState),具体步骤如下:
- 先定义基础的
fetchBaseQuery配置,再写一个包装函数处理token刷新逻辑 - 在包装函数里检查请求是否因token过期失败(比如后端返回401状态码)
- 刷新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
相关产品推荐
相关产品推荐

