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

为什么Express服务POST接口的req.body取值为undefined?

问题原因

1. 核心为代码缺失Express请求体解析中间件

Express v4.16.0之后的版本默认不会自动解析POST请求的body内容,你需要手动挂载对应格式的解析中间件才能让req.body正常获取值。
你需要在注册路由前,添加如下代码:

// 解析application/json格式的请求体
app.use(express.json())
// 如果需要解析form-urlencoded格式(比如表单提交),再加这一行
app.use(express.urlencoded({ extended: true }))

2. 也可能存在Postman使用不当的情况

如果已经加了上述中间件还是返回undefined,需要检查Postman的请求配置:

  • 请求方式必须选择POST,接口地址对应http://localhost:3000/hi
  • 请求头需要和你发送的body格式匹配:如果传JSON格式,要确保请求头Content-Type值为application/json;如果是表单格式,对应application/x-www-form-urlencoded
  • Body标签页下的内容格式要和请求头匹配:选raw后右侧格式选JSON,不要选form-data、binary等不匹配的格式,且发送的JSON语法要合法,示例如下:
{
  "name": "test"
}

修复后的完整代码参考

const express = require('express')
const Joi = require('joi')
const app = express()

// 解析中间件必须放在路由注册之前
app.use(express.json())
app.use(express.urlencoded({ extended: true }))

app.post("/hi",(req, res)=>{
    const schema = Joi.object({
        name: Joi.string().min(2).required()
    });
    const result=schema.validate(req.body);
    if(result.error){
        res.status(400).send(result.error);
        return;
    }
    console.log(req.body);
    res.send('success')
});

const port=process.env.PORT || 3000
app.listen(port, ()=>{
    console.log("listening on port "+port );
});

内容的提问来源于stack exchange,提问作者ninety-ninehundred

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:24:03