如何在RTK Query baseApi中全局配置validateStatus
问题解答
完全不需要在每个端点单独配置validateStatus,也没必要封装injectEndpoints实现需求,直接在createApi创建基础API实例时做全局配置即可,所有通过该实例定义、注入的端点都会自动继承这套校验规则。
全局配置方法
fetchBaseQuery本身就支持传入validateStatus配置项,在这里写的校验逻辑会对所有请求生效,你只需要把HTTP状态码判断和业务errorCode判断都写在这里即可,参考代码:
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react' // 替换成你业务实际约定的成功错误码 const BUSINESS_SUCCESS_CODE = 0 export const baseApi = createApi({ reducerPath: 'baseApi', baseQuery: fetchBaseQuery({ baseUrl: '/api/', // 替换成你的接口前缀 // 全局响应校验逻辑 validateStatus: (response, resData) => { // 先判断HTTP状态是否正常 const httpValid = response.status >= 200 && response.status < 300 // 再判断业务错误码是否为成功状态 const businessValid = resData?.errorCode === BUSINESS_SUCCESS_CODE return httpValid && businessValid } }), endpoints: () => ({}) })
后续你无论是直接在createApi里写endpoints,还是调用baseApi.injectEndpoints注入新的接口,都不需要再单独写validateStatus,校验不通过的请求会自动进入错误处理逻辑,和普通HTTP报错的行为完全一致。
更灵活的自定义baseQuery方案
如果你需要额外加全局错误处理逻辑,比如错误码统一弹窗、登录态失效自动跳登录页,可以封装一层自定义baseQuery,自由度比直接配validateStatus更高:
const rawFetchQuery = fetchBaseQuery({ baseUrl: '/api/' }) const wrappedBaseQuery = async (args, api, extraOptions) => { const result = await rawFetchQuery(args, api, extraOptions) // 统一处理业务错误 if (result.data?.errorCode && result.data.errorCode !== BUSINESS_SUCCESS_CODE) { // 在这里加全局错误提示、401登出跳转等通用逻辑 return { error: { status: result.data.errorCode, data: result.data } } } return result } // createApi时传入封装后的baseQuery即可 export const baseApi = createApi({ reducerPath: 'baseApi', baseQuery: wrappedBaseQuery, endpoints: () => ({}) })
补充:如果个别接口有特殊的校验规则,你依然可以在对应端点的配置里单独写
validateStatus,端点的配置优先级高于全局配置,不会互相影响。
内容的提问来源于stack exchange,提问作者Jonathan Tuzman
相关产品推荐
相关产品推荐

