使用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
相关产品推荐
相关产品推荐

