Mongoose新建文档_id为null 保存触发must have an _id报错
问题原因
报错由两个代码错误共同导致:
- Mongoose模型实例化传参格式错误。
new Link()构造方法仅接收1个文档对象作为入参,你当前写法传入了3个独立对象:new Link({ user: user }, { link: URL }, { price: "N/A" }),仅第一个对象内的user字段会被识别写入,link、price字段完全未被挂载到新文档上,同时错误的传参格式会打断Mongoose自动生成_id的初始化流程,最终出现newLink.id打印为null、保存时报"document must have an _id before saving"的问题。 - Schema配置存在拼写错误。你在Link.js中把必填校验属性
required错写为requiered(i、e字母顺序颠倒),Mongoose无法识别该拼写的配置,后续字段必填校验规则会完全失效。
修复步骤
- 修正add.js中创建新文档的传参逻辑,将所有字段合并到同一个对象中传入:
// 修正后的实例化代码 var newLink = new Link({ user: user, link: URL, price: "N/A" })
修改后再打印newLink.id即可看到Mongoose自动生成的ObjectId值,不会再返回null。
- 修正Link.js中Schema的拼写错误,将所有错写的
requiered替换为正确的required:
const mongoose = require("mongoose"); const Schema = mongoose.Schema; const LinkSchema = new Schema({ user: { type: String, required: true }, link: { type: String, required: true }, price: { type: String, required: true }, }) module.exports = mongoose.model("Link", LinkSchema);
额外优化建议
你当前每次执行命令都重复创建、关闭MongoDB连接的写法性能很差,建议把数据库连接逻辑移到机器人启动入口文件中,程序启动时仅连接一次数据库即可,不要在每次命令处理逻辑中重复开关连接,否则请求量高时很容易触发连接池耗尽的问题。
内容的提问来源于stack exchange,提问作者CherryPirate
相关产品推荐
相关产品推荐

