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

使用RTK Query、Node.js和Express时请求体为空的问题

请求体为空的原因及修复方案

核心问题

你的请求体为空主要有两个原因:

  • 请求发送的格式不符合express.json()的解析要求
  • 后端代码没有正确读取请求体中的数据

具体分析与修复

  1. RTK Query请求格式错误
    你直接把字符串tvId作为body传递,但express.json()只处理application/json类型的请求体。纯字符串请求的Content-Type不是JSON,所以express不会解析它,导致req.body为空。

修复代码(RTK Query部分):

export const apiSlice = createApi({
  reducerPath: "api",
  baseQuery: fetchBaseQuery({
    baseUrl: "http://localhost:3001",
    // credentials: "include",
  }),
  endpoints: (builder) => ({
    createRoom: builder.mutation({
      query: (tvId: string) => {
        console.log("Id from action", tvId);
        return {
          url: "/rooms",
          method: "POST",
          body: { tvId }, // 将字符串包装为JSON对象
        };
      },
    }),
  }),
});
  1. 后端路由未正确读取请求体
    你的后端代码中直接使用了未定义的tvId变量,正确的做法是从req.body中提取数据。

修复代码(后端路由部分):

router.post("/rooms", async(req, res) => {
  const { tvId } = req.body; // 从请求体解构获取tvId
  console.log("the tv id is ", tvId);
  // 这里可以添加后续的业务逻辑,比如创建房间等
});

module.exports = router;

可选方案(如果需要发送纯字符串)

如果一定要发送纯字符串而不是JSON,需要修改express中间件,添加express.text()来解析文本类型的请求体,同时在RTK Query中指定请求头:

  • 后端添加中间件:app.use(express.text())
  • RTK Query修改请求配置:
body: tvId,
headers: { 'Content-Type': 'text/plain' }

但这种方式通用性较差,推荐优先使用JSON格式的请求体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:00:57