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

