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

