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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:15:05