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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:02:59