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

如何在RTK Query中实现响应拦截器处理未授权跳转与令牌清除

在RTK Query中处理未授权响应的全局/组级方案

RTK Query 提供了两种核心方式来实现类似Angular HTTP拦截器的未授权响应处理,无需在每个请求中重复编写逻辑:

一、全局拦截:自定义BaseQuery包装器

这是最接近Angular全局拦截器的方案,通过包装默认的fetchBaseQuery,在底层统一处理所有请求的错误响应:

import { fetchBaseQuery, createApi } from '@reduxjs/toolkit/query/react';
// 替换为你的实际工具函数:清除令牌、跳转登录页
import { clearAuthToken, navigateToLogin } from './auth/utils';

// 基础查询配置
const rawBaseQuery = fetchBaseQuery({ baseUrl: '/api' });

// 带授权拦截的包装器
const baseQueryWithAuthCheck = async (args, api, extraOptions) => {
  const result = await rawBaseQuery(args, api, extraOptions);

  // 拦截401未授权错误
  if (result.error && result.error.status === 401) {
    clearAuthToken();
    navigateToLogin();
  }

  return result;
};

// 创建全局API切片,所有请求自动应用拦截逻辑
export const globalApi = createApi({
  baseQuery: baseQueryWithAuthCheck,
  endpoints: (builder) => ({
    // 定义你的查询/突变
    getPosts: builder.query({ query: () => '/posts' }),
    createPost: builder.mutation({ query: (data) => ({ url: '/posts', method: 'POST', body: data }) })
  }),
});

二、组级拦截:针对特定API组应用拦截

如果只想为某一组相关请求处理未授权,可以为该组单独创建API切片,使用带拦截逻辑的baseQuery:

// 用户相关API切片,仅该组请求应用授权拦截
export const userApi = createApi({
  baseQuery: baseQueryWithAuthCheck, // 复用上面的拦截包装器
  endpoints: (builder) => ({
    getUserProfile: builder.query({ query: () => '/user/profile' }),
    updateUserInfo: builder.mutation({ query: (data) => ({ url: '/user', method: 'PUT', body: data }) })
  }),
});

如果仅需为单个端点处理,也可以使用transformErrorResponse字段(适合零散需求):

getUserProfile: builder.query({
  query: () => '/user/profile',
  transformErrorResponse: (error) => {
    if (error.status === 401) {
      clearAuthToken();
      navigateToLogin();
    }
    return error;
  },
}),

为什么不推荐用transformResponse?

transformResponse仅处理成功响应(HTTP状态码2xx),而未授权属于错误响应(4xx/5xx),因此不会触发该回调,用它处理未授权逻辑完全不适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:36:18