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

Post请求Request body为空及model.save()输出异常问题排查

解决你的两个Express + MongoDB问题:req.body为空和model.save()无效

让我一步步帮你排查并解决这两个问题:


问题1:POST请求中req.body为空(输出undefined)

你的代码里犯了一个常见的Express中间件顺序错误:你在定义完所有路由之后才挂载body-parser中间件。Express的中间件是按照代码书写顺序执行的,当请求到达/app的POST路由时,body-parser还没来得及解析请求体,所以req.body自然是undefined。

修复方法:

把body-parser的挂载代码移到所有路由定义之前,确保请求在到达路由前已经完成请求体解析:

// 先挂载body-parser中间件
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());

// 再定义路由
app.get('/',(req,res)=> res.send("ROOT PAGE"));
app.route('/app')
 .get((req,res)=>res.send("Nothing here"))
 .post(postData);

问题2:model.save()返回无效输出

这个问题是由两个原因叠加导致的:一是上面的req.body为空,二是你颠倒了Schema和Model的定义顺序——你先创建了dataModel,之后才定义了data这个Schema对象。当mongoose.model执行时,data还未被定义,相当于传入了一个undefined的Schema,这会导致Model无法正确初始化,后续的save操作自然会失效。

修复方法:

先定义Schema对象,再基于Schema创建Model:

// 先定义Schema
var data={ value: Number }
// 再创建Model
const dataModel=mongoose.model('dataCollection',mongoose.Schema(data))

修复后的完整代码

把这两个问题修复后,完整代码如下(顺便帮你去掉了重复引入的body-parser):

// Imports
var express=require("express") , mongoose=require("mongoose") , bodyParser= require('body-parser');
const { Int32 } = require("bson");

// Constants
const app = express()
const PORT=4002

// 先定义Schema
var data={ value: Number }
// 再创建Model
const dataModel=mongoose.model('dataCollection',mongoose.Schema(data))

// Making connection with database
mongoose.Promise= global.Promise;
mongoose.connect('mongodb://localhost/testdb', { useNewUrlParser:true, useUnifiedTopology:true })

// Create the controller to save data
function postData(req,res){
 console.log(req.body)
 let newData = new dataModel(req.body)
 newData.save((err,resp)=>{
 if(err) console.log(err)
 else res.json(resp)
 })
}

// 先挂载body-parser中间件
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());

// 再定义路由
app.get('/',(req,res)=> res.send("ROOT PAGE"));
app.route('/app')
 .get((req,res)=>res.send("Nothing here"))
 .post(postData);

// start listening on server
app.listen(PORT,()=>console.log(`Your application is running on Port: ${PORT}`));

现在再测试你的POST请求,req.body应该能正确获取到请求体,newData.save()也能正常返回保存后的文档了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:39:47