使用Mongoose中间件自动创建关联文档时遇MissingSchemaError求助
解决Mongoose后置中间件中MissingSchemaError的问题
这个错误的根源其实很简单——你在中间件里引用模型的名称和注册模型时的名称大小写不匹配!
你注册UserPreference模型时用的是小写开头的字符串:
const UserPreference = mongoose.model('userPreference',userPreference);
但在后置中间件里调用this.model()时,却用了大写开头的"UserPreference":
await this.model("UserPreference").create({Id:this.Id})
Mongoose查找模型时是严格匹配注册时传入的名称字符串的,大小写完全一致才会找到对应的Schema,这就是为什么会抛出MissingSchemaError。
几种可行的解决方案:
1. 统一模型名称的大小写(推荐保持风格一致)
要么把中间件里的模型名改成和注册时一致的小写:
userInfo.post('save', async function() { console.log('Middleware begins') await this.model("userPreference").create({Id:this.Id}) });
要么注册模型时使用大写开头的名称,和中间件里的引用保持统一:
// 注册时用大写开头的模型名 const UserPreference = mongoose.model('UserPreference',userPreference); // 中间件里正常使用 userInfo.post('save', async function() { console.log('Middleware begins') await this.model("UserPreference").create({Id:this.Id}) });
2. 直接引用已定义的模型变量(更稳妥)
既然你已经在代码里定义了UserPreference变量,完全可以跳过this.model()的查找,直接在中间件里使用这个变量,这样还能避免字符串匹配的失误:
userInfo.post('save', async function() { console.log('Middleware begins') // 直接用已经定义好的UserPreference模型 await UserPreference.create({Id:this.Id}) });
额外说明:
你已经确保了模型注册代码在中间件定义之前执行,这一点是对的,所以不是顺序问题。主要就是模型名称的大小写匹配问题,调整之后就能正常创建userPreference文档了。
内容的提问来源于stack exchange,提问作者Junyan Liu




