为什么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
相关产品推荐
相关产品推荐

