RTKQ Mutation遇204响应一直处于pending状态问题求助
问题原因
这不是Redux Toolkit的预期行为,核心问题出在fetchBaseQuery对204/205响应的默认处理逻辑上。
HTTP 204(无内容)和205(重置内容)要求响应体必须为空,但fetchBaseQuery默认会尝试将所有成功响应的内容解析为JSON。当遇到204/205时,调用response.json()会抛出错误,而默认的fetchBaseQuery没有针对这种情况做特殊处理,导致请求Promise无法正常resolve或reject,最终Mutation一直卡在pending状态。
解决方案
方案1:自定义baseQuery处理204/205响应
你需要自定义baseQuery,对204/205状态码做特殊处理,直接返回空数据而不尝试解析响应体:
import { fetchBaseQuery, createApi } from '@reduxjs/toolkit/query/react'; const customBaseQuery = async (args, api, extraOptions) => { const result = await fetchBaseQuery({ baseUrl: BASE_URL })(args, api, extraOptions); // 针对204/205返回空数据,让Mutation进入fulfilled状态 if (result.meta?.response?.status === 204 || result.meta?.response?.status === 205) { return { data: null }; } return result; }; export const api = createApi({ baseQuery: customBaseQuery, endpoints: (builder) => ({ updatePost: builder.mutation({ query: ({ id, body }) => ({ url: `${UPDATE_POST_URL}/${id}`, method: 'PUT', body, }), }), }), });
方案2:修正服务器端响应逻辑
服务器端调用next()可能导致响应未正确结束,改为直接用res.end()关闭响应:
server.put('/UPDATE_POST_URL/:id', (req, res) => { const { params: { id }, body } = req; // 执行数据库更新逻辑 res.status(204).end(); // 直接结束响应,不要调用next() });
补充说明
204/205是合法的成功状态码,RTKQ本身应该支持,但默认的fetchBaseQuery没覆盖这个边缘场景,所以需要手动适配。自定义baseQuery后,Mutation会拿到data: null并进入fulfilled状态,成功、失败回调都能正常触发。
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

