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

如何在RTK-Query的端点中访问Redux Toolkit存储?

在RTK Query端点中访问Redux Store数据

以下是两种可行的实现方案,结合你的代码示例给出具体修改:

方案1:使用queryFn替代query(推荐,直接访问Store)

RTK Query的mutation支持通过queryFn替代query字段,queryFn会接收包含getState的参数,可直接获取Redux Store中的数据,同时能在同一逻辑里处理请求和响应解密。

修改代码如下:

import { createApi } from '@reduxjs/toolkit/query/react'
import customFetchBase from './customFetchBase.js'
import { aesDEC } from 'src/util/public.util.js'

export const authApi = createApi({
  reducerPath: 'authApi',
  baseQuery: customFetchBase,
  endpoints: builder => ({
    getUser: builder.mutation({
      queryFn: async (_, { getState, baseQuery }) => {
        // 从Store中获取salt(路径根据你的实际slice结构调整)
        const { salt } = getState().user;
        
        // 调用baseQuery发起请求
        const requestResult = await baseQuery({
          url: '/Account/Login/GetUserInfo',
          method: 'POST',
          body: {
            RequestVerificationToken: salt
          }
        });

        // 请求成功时解密响应数据
        if (requestResult.data) {
          const decryptedData = aesDEC(requestResult.data.data, salt);
          return { data: decryptedData };
        }

        // 请求失败时直接返回错误结果
        return requestResult;
      },
    }),
  })
})
export const { useGetUserMutation } = authApi

方案2:通过BaseQuery传递Store数据

若希望保留query字段,可以修改自定义customFetchBase,让它获取Store数据并附加到请求上下文,再在query和响应处理中使用。

第一步:修改customFetchBase

// customFetchBase.js
import { fetchBaseQuery } from '@reduxjs/toolkit/query/react';

export default async (args, api, extraOptions) => {
  const baseQuery = fetchBaseQuery({ baseUrl: '/your-base-url' });
  const result = await baseQuery(args, api, extraOptions);
  
  // 将salt附加到响应meta中,供transformResponse使用
  if (result.meta) {
    result.meta.salt = api.getState().user.salt;
  }
  return result;
};

第二步:更新端点配置

getUser: builder.mutation({
  query: (_, { getState }) => {
    // 从Store获取salt并拼接请求体
    const { salt } = getState().user;
    return {
      url: '/Account/Login/GetUserInfo',
      method: 'POST',
      body: {
        RequestVerificationToken: salt
      }
    };
  },
  transformResponse: (response, meta) => {
    // 从meta中获取salt并解密响应
    return aesDEC(response.data, meta.salt);
  },
}),

注意事项

  • 确保Store数据的路径正确(示例中为getState().user.salt,需根据你的实际slice结构调整)
  • 敏感数据如salt需注意传输和使用过程中的安全性,避免泄露

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:02:40