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

使用router.post()时req.body为undefined,app.post()却正常的问题

问题:Express路由中req.body为undefined的原因

场景说明

在Express项目中,将POST接口放在单独路由文件auth.js时,无法获取req.body(返回undefined),但把接口直接写在app.js中就能正常获取。相关代码如下:

错误代码示例

app.js

const express = require('express');
const bodyParser = require('body-parser');
const authRoutes = require('./routes/auth');
const app = express();

app.use(`$/api/auth`, authRoutes)

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))

module.exports = app;

routes/auth.js

const express = require("express");
const router = express.Router();

router.post("/register",  (req, res) =>{
    res.status(200).json(req.body);
})

正常运行代码示例(接口移至app.js)

const express = require('express');
const bodyParser = require('body-parser');
const authRoutes = require('./routes/auth');
const app = express();

// app.use(`$/api/auth`, authRoutes)

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))

app.post("/api/auth/register", (req, res) =>{
    res.status(200).json(req.body)
})
 
module.exports = app;

问题原因

核心问题在于Express中间件的执行顺序:

  • Express的中间件按注册顺序依次处理请求,请求会先经过先注册的中间件。
  • 错误代码中,先挂载了authRoutes路由,之后才注册body-parser解析中间件。当请求进入auth.js的接口时,body-parser还未对请求体进行解析,因此req.body为undefined。
  • 接口移至app.js后,body-parser先完成注册,请求会先经过解析中间件处理,再进入接口逻辑,自然能拿到解析后的req.body。

另外注意:错误代码中app.use($/api/auth, authRoutes)的$是多余字符,会导致路由无法匹配,但这不是req.body undefined的直接原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:22:09