Express+Mongoose通过POST向MongoDB写数据失败问题排查
问题描述
我希望通过Express服务器的POST方法向MongoDB写入数据,已完成以下配置:
1. Mongoose模型定义
const mongoose=require("mongoose") const LogInSchema=new mongoose.Schema({ name:{ type:String, required:true }, password:{ type:String, required:true } }) const user=new mongoose.model("UserList", LogInSchema) module.exports=user
2. 数据库连接脚本
const mongoose=require("mongoose") function connectdb() { mongoose.connect("mongodb://localhost:27017/User") .then(()=>{ console.log("connected to db"); }) .catch(()=>{ console.log("There was a problem"); })} module.exports = {connectdb};
3. 两个POST接口尝试写入数据
第一个接口:
app.post("/signup",async (req,res)=>{ const data={ name:req.body.name, password:req.body.password, } console.log(data) await user.insertMany([data]) })
第二个接口:
app.post("/signup",async (req,res)=>{ const data = new user(req.body); console.log(data) try { await data.save(); res.send(data); } catch (error) { res.status(500).send(error); } })
当前状态:MongoShell中已创建User数据库,终端能打印输入的数据,浏览器也能返回数据,但使用db.User.find()查询时,数据库中无数据。
疑问:await user.insertMany([data])的写法是否正确?为何数据未写入数据库?
问题分析与解决
1. insertMany写法的正确性
await user.insertMany([data])语法本身没问题,但这个接口存在两处缺陷:
- 未捕获插入异常,出错后无法定位问题
- 未给客户端返回响应,请求会长期挂起
建议修改为:
app.post("/signup",async (req,res)=>{ const data={ name:req.body.name, password:req.body.password, } console.log(data) try { await user.insertMany([data]); res.status(201).send("数据插入成功"); } catch (err) { res.status(500).send("插入失败:" + err.message); } })
2. 数据查不到的核心原因
你用db.User.find()查询是错误的,Mongoose会自动将模型名称转为小写复数形式作为集合名:
- 你的模型名为
UserList,对应的集合实际是userlists - 在
User数据库中,正确的查询命令应该是:
db.userlists.find()
3. 第二个接口的说明
第二个接口的写法是Mongoose保存数据的标准流程,new user(req.body)创建实例后调用save(),且已处理异常和响应,只要请求参数符合Schema要求,数据会正常写入userlists集合。
内容的提问来源于stack exchange,提问作者coldstone
相关产品推荐
相关产品推荐

