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

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无法识别该拼写的配置,后续字段必填校验规则会完全失效。
修复步骤
  1. 修正add.js中创建新文档的传参逻辑,将所有字段合并到同一个对象中传入:
// 修正后的实例化代码
var newLink = new Link({ 
    user: user, 
    link: URL, 
    price: "N/A" 
})

修改后再打印newLink.id即可看到Mongoose自动生成的ObjectId值,不会再返回null。

  1. 修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:57:23