本地运行正常部署到服务器后express POST接口req.body为空如何解决
问题核心原因
- 你在
client.js的fetch请求中配置了mode: 'no-cors',该模式有严格的限制:仅支持三种简单Content-Type(application/x-www-form-urlencoded、multipart/form-data、text/plain),你自定义的Content-Type: application/json会被浏览器自动删除,同时请求体无法被后端JSON解析器正确识别,最终导致req.body为空。 - 你的Express服务没有配置跨域资源共享(CORS)中间件,仅给Socket.IO配置的CORS规则不生效于普通POST接口,跨域请求会被拦截。
解决方案
第一步:修改客户端fetch配置
删除mode : 'no-cors'这一行,修改后的client.js代码如下:
await fetch("https://example.com:30000/subscribeA", { method: "post", body: JSON.stringify({ dataSubscribe: subscription, dataNotif: dataNotif}), headers: { "Content-Type": "application/json" } }); console.log("Push Sent...");
第二步:给Express配置CORS中间件
- 先安装cors依赖:
npm install cors - 在
index.js中引入并启用cors:
在const bodyParser = require("body-parser");这一行后面添加以下代码:
const cors = require('cors'); app.use(cors({ origin: '*', // 生产环境建议替换为你的前端实际域名,如'https://your-frontend.com' methods: ["GET", "POST"], credentials: true }));
可选优化
新版本Express已经内置JSON解析能力,你可以直接用app.use(express.json())替代app.use(bodyParser.json()),无需额外安装body-parser依赖,功能完全一致。
修改完成后重启后端服务,再次发起请求就能正常获取到req.body中的数据了。
内容的提问来源于stack exchange,提问作者Hi mynameis
相关产品推荐
相关产品推荐

