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

Mongoose Schema中Schema.Types.ObjectId类型字段打印不显示问题

排查步骤

  1. 先确认数据库中对应文档是否存在author字段
    直接通过MongoDB Shell执行查询命令:
    db.farms.findOne({_id: ObjectId("612fd96ab7f9394de07b4c1b")})
    
    如果返回结果中没有author字段,说明你在保存Farm数据的逻辑中没有给该字段赋值,和字段类型无关。你之前改为String类型能显示,是因为改类型的同时新增了表单输入项,保存时传入了对应值,本质是存了数据才会显示。
  2. 确认存储逻辑是否正确
    检查你新增Farm的路由代码,是否在保存前给author字段赋值了当前登录用户的_id,示例逻辑如下:
    // 假设你使用Passport做登录校验,req.user存储了当前登录用户信息
    const newFarm = new Farm(req.body.farm);
    newFarm.author = req.user._id; // 绝大多数新手都会漏掉这行代码
    await newFarm.save();
    
  3. 排查Mongoose序列化配置问题
    如果数据库中确实存在author字段,但打印时看不到,按以下步骤验证:
    • 单独打印author字段而非整个对象,确认字段是否存在:<%= console.log(farm.author) %>,如果能输出值,说明是Mongoose序列化JSON时自动省略了未赋值/undefined的ObjectId类型字段
    • 可以在Schema的author字段配置中添加默认值default: null,这样哪怕未赋值也会显示author: null,不会被序列化逻辑省略
    • 打印时先转为普通JS对象再输出:<%= console.log(farm.toObject()) %>,绕过Mongoose的序列化规则

依赖版本报错解决方案

你提到的升级依赖后报错是因为Colt Steele的课程代码基于Mongoose 5.x开发,最新的Mongoose 7/8版本存在大量破坏性变更,不需要强行升级到最新版,直接固定依赖版本即可:
在package.json中指定版本号:

{
  "mongoose": "^5.13.20",
  "connect-mongo": "^3.2.0"
}

删除node_modules和package-lock.json后重新执行npm install即可正常运行,不会抛出版本兼容错误。


内容的提问来源于stack exchange,提问作者Robert Francis Jr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:21:02