Express 4.18.3中req.body无法解析的问题求助
Express 4.18.3中req.body始终返回undefined的问题解决
问题场景
使用Express 4.18.3框架时,遇到req.body始终无法解析、返回undefined的问题,项目代码及请求示例如下:
项目代码
import express, { Express, Request, Response } from 'express' import dotenv from 'dotenv' import v1 from './routes/index' dotenv.config() const app: Express = express() app.use('/', v1) app.use(express.json()) app.use(express.urlencoded({ extended: true })) const port = process.env.PORT || 3000 const startExpressServer = () => { app.listen(port, () => { console.log(`[server]: Server is running at http://localhost:${port}`) }) } startExpressServer()
请求示例
curl --location 'http://localhost:3000/user/login' \ --header 'Content-Type: application/json' \ --data '{ "apiKey": "test" }'
问题原因
Express中间件的执行顺序是从上到下的,你先注册了路由app.use('/', v1),之后才添加请求体解析中间件express.json()和express.urlencoded()。这意味着当请求到达路由时,解析请求体的中间件还未执行,自然无法获取到req.body。
解决方案
调整中间件顺序,将请求体解析中间件放在路由注册之前:
修改后的代码
import express, { Express, Request, Response } from 'express' import dotenv from 'dotenv' import v1 from './routes/index' dotenv.config() const app: Express = express() // 先添加请求体解析中间件 app.use(express.json()) app.use(express.urlencoded({ extended: true })) // 再注册路由 app.use('/', v1) const port = process.env.PORT || 3000 const startExpressServer = () => { app.listen(port, () => { console.log(`[server]: Server is running at http://localhost:${port}`) }) } startExpressServer()
这样当请求进入路由时,请求体已经被解析完成,req.body就能正常获取到传入的JSON数据了。
内容的提问来源于stack exchange,提问作者OliverKhl
相关产品推荐
相关产品推荐

