使用RTK Query、Node.js和Express时请求体为空的问题
请求体为空的原因及修复方案
核心问题
你的请求体为空主要有两个原因:
- 请求发送的格式不符合
express.json()的解析要求 - 后端代码没有正确读取请求体中的数据
具体分析与修复
- 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对象 }; }, }), }), });
- 后端路由未正确读取请求体
你的后端代码中直接使用了未定义的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
相关产品推荐
相关产品推荐

