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

如何记录Redux-Toolkit Query发起的所有API请求?

记录RTK Query的API调用与状态变更的可选方案

1. 扩展RTK Query的API中间件,监听action

RTK Query在创建API切片时允许添加自定义中间件逻辑,可直接捕获它生成的所有action(包括请求发起、成功、失败的action,以及缓存更新的action),以此记录API调用和状态变更。

示例(创建API切片时添加):

import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';

const apiSlice = createApi({
  baseQuery: fetchBaseQuery({ baseUrl: '/api' }),
  endpoints: (builder) => ({
    // 你的端点定义
  }),
  // 自定义中间件逻辑
  middleware: (api) => (next) => (action) => {
    // 只处理RTK Query相关的action
    if (action.type.startsWith(api.reducerPath)) {
      // 记录请求核心信息:action类型、端点名称、参数、时间戳等
      console.log('RTK Query Action:', {
        type: action.type,
        endpoint: action.meta?.arg?.endpointName,
        params: action.meta?.arg?.originalArgs,
        timestamp: Date.now()
      });
      // 若需上报服务端,可在此调用上报接口
    }
    return next(action);
  },
});

该API切片的中间件会自动被getDefaultMiddleware()包含,无需手动额外添加(你的现有store配置已正确处理这一点)。

2. 自定义baseQuery包装fetch,记录请求全流程

不用替换fetch,可封装一个自定义baseQuery,在调用原生fetch前后插入日志逻辑,所有经过RTK Query的API请求都会被捕获。

示例代码:

import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';

// 包装原生fetch的自定义baseQuery
const customBaseQuery = async (args, api, extraOptions) => {
  // 记录请求发起时的信息
  const requestLog = {
    url: typeof args === 'string' ? args : args.url,
    method: typeof args === 'string' ? 'GET' : args.method || 'GET',
    params: typeof args === 'string' ? undefined : args.params,
    timestamp: Date.now()
  };
  console.log('RTK Query API Request:', requestLog);

  // 调用原生fetch的baseQuery逻辑
  const result = await fetchBaseQuery({ baseUrl: '/api' })(args, api, extraOptions);

  // 记录响应结果
  console.log('RTK Query API Response:', {
    ...requestLog,
    status: result.error ? result.error.status : 200,
    data: result.data,
    error: result.error?.message
  });

  return result;
};

// 使用自定义baseQuery创建API切片
const apiSlice = createApi({
  baseQuery: customBaseQuery,
  endpoints: (builder) => ({
    // 你的端点定义
  }),
});

这种方式完全基于原生fetch,无需替换为axios,能精准捕获每个请求的发起与响应细节。

3. 利用Redux Store的subscribe监听状态变更

Redux Store自带subscribe方法,可在store创建后订阅状态变化,对比前后状态中RTK Query的缓存部分,记录变更内容。

示例(在你的store配置文件中添加):

import { apiSlice } from './path-to-your-api-slice'; // 导入你的API切片

// 保存上一次的RTK Query状态快照
let prevApiState = store.getState()[apiSlice.reducerPath];

store.subscribe(() => {
  const currentApiState = store.getState()[apiSlice.reducerPath];
  // 仅在状态变化时记录
  if (currentApiState !== prevApiState) {
    console.log('RTK Query State Changed:', {
      previous: prevApiState,
      current: currentApiState,
      timestamp: Date.now()
    });
    // 上报服务端逻辑可在此实现
    prevApiState = currentApiState;
  }
});

注意:这种方式会监听所有状态变化,可能产生冗余日志,适合需要完整追踪缓存状态变更的场景。

4. 自定义redux-logger过滤规则,聚焦RTK Query日志

如果你已经在用redux-logger,可以自定义过滤和格式化规则,只保留RTK Query相关的action与状态变更,同时扩展日志内容。

修改你的现有store配置:

import { configureStore } from '@reduxjs/toolkit';
import logger from 'redux-logger'
import { apiSlice } from './path-to-your-api-slice'; // 导入你的API切片

import { rootReducer } from 'src/reducers/rootReducer';

const otherMiddlewares: any[] = [];

if (process.env.NODE_ENV === `development`) {
  // 自定义logger,仅记录RTK Query相关内容
  const customLogger = logger({
    predicate: (getState, action) => {
      // 过滤出RTK Query的action
      return action.type.startsWith(apiSlice.reducerPath);
    },
    // 自定义日志格式,补充API细节
    formatter: (action, getState, previousState) => {
      return {
        actionType: action.type,
        endpoint: action.meta?.arg?.endpointName,
        params: action.meta?.arg?.originalArgs,
        prevApiState: previousState[apiSlice.reducerPath],
        currentApiState: getState()[apiSlice.reducerPath],
        timestamp: Date.now()
      };
    }
  });
  otherMiddlewares.push(customLogger);
}

export const store = configureStore({
  reducer: rootReducer,
  devTools: process.env.NODE_ENV !== 'production',
  middleware: (getDefaultMiddleware) => 
    getDefaultMiddleware().concat(otherMiddlewares)
});

export type AppDispatch = typeof store.dispatch;
export type RootState = ReturnType<typeof store.getState>;

这种方式可复用现有redux-logger配置,精准聚焦RTK Query的相关日志。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:43:09