使用Mongoose进行populate时出现MissingSchemaError问题求助
问题分析与修复方案
嘿,我帮你找出了代码里的几个关键错误,正是这些问题导致了MissingSchemaError:
1. 模型引入完全搞反了
你在控制器里的引入代码写反了模型和文件的对应关系:
// 错误写法 var Post = require('../models/User'), User = require('../models/Posts');
正确的应该是从User.js引入User模型,从Posts.js引入Post模型:
// 修正后 var User = require('../models/User'), Post = require('../models/Posts');
2. 模型注册名称与引用不匹配 + 字段类型拼写错误
你的User模型导出时用的是小写的'user':
// User.js里的导出 module.exports = mongoose.model('user', UserSchema);
但在Posts模型的关联字段里,你引用的是大写的'User',还写错了类型名称(应该是Schema.Types.ObjectId,不是Schema.Type.ObjectId):
// Posts.js里的错误关联定义 user: {type: Schema.Type.ObjectId, ref: 'User'}
Mongoose对模型名称的大小写是敏感的,要保持统一。推荐把User模型的导出名称改成大写的'User',同时修正字段类型:
// User.js修正导出 module.exports = mongoose.model('User', UserSchema); // Posts.js修正关联字段 user: {type: Schema.Types.ObjectId, ref: 'User'}
3. Posts模型忘记导出了!
看你的Posts.js代码,最后没有导出模型!这会导致控制器里require('../models/Posts')拿到的是undefined,直接引发Schema未注册的错误。必须添加导出语句:
// Posts.js末尾添加 module.exports = mongoose.model('Post', PostSchema);
4. 默认时间的错误用法
你在两个模型里都写了default: moment(),这会导致所有新创建文档的created_at都是Schema定义时的固定时间,而不是文档实际创建的时间!因为moment()在Schema定义阶段就执行了,应该用一个函数来动态返回当前时间,还要把moment对象转成mongoose支持的Date类型:
// User.js和Posts.js里的created_at字段修正 created_at: {type: Date, default: () => moment().toDate()} // 或者更简单的用原生JS的Date:default: Date.now
把这些错误全部修复后,你的关联查询Post.find().populate('user').exec()就能正常运行啦。
内容的提问来源于stack exchange,提问作者Buu97
相关产品推荐
相关产品推荐

