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

Express POST请求req.body为空 MongoDB无法正常接收提交数据问题咨询

问题原因排查

核心错误:前端fetch配置字段拼写错误

fetch请求的配置项中指定请求头的字段是复数headers,你的代码中误写为单数header,导致Content-Type: application/json未生效,后端无法识别请求体为JSON格式,解析后得到的req.body自然为空。

次要问题:JSON解析中间件重复注册

Express 4.16+ 版本已经内置express.json()和express.urlencoded()解析中间件,不需要额外引入body-parser库,你在入口文件、路由文件中多次重复注册JSON解析中间件,属于冗余配置,虽然不会直接导致req.body为空,但可能引发不可预期的解析异常。


修复步骤

1. 修正前端fetch配置

将send函数中header字段改为headers:

const send = async(body) => {
    let res = await fetch("/api", {
        method: "post",
        // 这里将单数header改为复数headers
        headers: {
            "Content-Type": "application/json",
            "Accept": "application/json"
        },
        body: JSON.stringify(body)
    });
    let data = await res.json();
    console.log(data)
}

2. 清理冗余中间件配置

入口文件index.js优化:

删除冗余的body-parser引入和注册逻辑,保留内置的解析中间件即可:

const express = require('express');
const app = express();
var path = require('path');

// 保留两个内置解析中间件即可
app.use(express.urlencoded({ extended: true }));
app.use(express.json());

app.use('/',require("./routes/routes"))
app.use(express.static(__dirname +'/public'))
app.use("/api", require('./data/api'))

app.listen(5000,function(){
    console.log('server is alive')
})

路由文件优化:

删除单独的body-parser引入和接口级别的解析中间件注册:

const router = require("express").Router();
const User = require("./model/models");

router.get("/", async (req, res) => {
    const data = await User.find({});
    res.json(data);
});

// 无需单独注册parser,全局解析中间件已经生效
router.post("/", async (req, res) => {
    console.log(req.body)
    await User(req.body).save();
    res.json({"msg": "ok"});
});

module.exports = router

内容的提问来源于stack exchange,提问作者GDTyka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:39:02