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

