NodeJS Express接收POST请求时body/params为空如何解决?
问题根因
你当前遇到的请求体为空的核心问题是客户端请求头配置错误:
你的Angular客户端代码手动设置了Content-Type: '*',这是无效的MIME类型。Express的JSON解析中间件只会处理Content-Type为application/json的请求,识别不到正确类型时会直接跳过解析,因此req.body为空对象。
修复步骤
1. 修正客户端请求头配置
Angular的HttpClient发送JSON格式请求时,会自动携带正确的Content-Type: application/json请求头,不需要手动配置,直接删除多余的headers参数即可:
testPost(parameter1: any, parameter2: any): Observable<any> { return this.http.post(URL_API.url, {'parameter1': parameter1, 'parameter2': parameter2}); }
如果需要手动指定,要设置为正确的JSON类型:
{headers: new HttpHeaders({'Content-Type': 'application/json'})}
2. 服务端参数读取配置
你当前的body-parser配置本身是有效的,Express 4.16及以上版本还可以直接使用内置的解析中间件,无需单独安装body-parser依赖,优化后的服务端代码如下:
const http = require('http'); const express = require('express'); const cors = require('cors'); const hostname = '127.0.0.1'; const port = 3000; const app = express(); const corsOptions = { origin: 'http://localhost:4200', allowedHeaders: ['Content-Type'] } app.options('*', cors(corsOptions)); app.use(cors(corsOptions)); // 内置中间件替代body-parser,功能完全一致 app.use(express.urlencoded({extended : true})); app.use(express.json()); app.post('/', function (req, res) { // 直接从req.body读取POST提交的JSON参数 console.log('parameter1值:', req.body.parameter1); console.log('parameter2值:', req.body.parameter2); res.send('Hello World!'); }) // 补充监听启动代码,漏加的话服务无法正常启动 app.listen(port, hostname, () => { console.log(`服务运行地址:http://${hostname}:${port}`); });
额外说明
req.params用于读取路由动态参数,只有当你定义了类似app.post('/:userId',...)这类带占位符的路由时,才能从req.params.userId拿到路径中的参数值,你的根路径路由没有占位符,自然为空。req.query用于读取URL查询参数,即地址栏问号后拼接的参数,比如/?id=123,才能从req.query.id拿到对应值,你的请求没有携带查询参数,因此为空。- 普通POST请求提交的JSON表单参数,全部存储在
req.body对象中,只要确保解析中间件配置正确、请求头类型匹配,直接读取即可。
内容的提问来源于stack exchange,提问作者NewUser2
相关产品推荐
相关产品推荐

