You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动