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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 10:54:52