NestJS使用Mongoose的populate时报ModuleSchema未注册如何解决?
问题原因
你当前的module.module.ts已经正确完成了Model注册,不需要额外修改注册配置,报错的根源是你在module.model.ts中定义modules关联字段的ref属性值和注册的模型名不匹配:
报错提示找不到名为ModuleSchema的模型,而你注册的模型名是M.name也就是Module,Mongoose做populate关联时会严格匹配ref值和已注册的模型名,匹配失败就会抛出该错误。
修复方法
- 调整Schema的关联字段配置
打开module.model.ts,找到modules字段的定义,将ref属性值改为你实际注册的模型名:
错误写法示例:
// 错误:ref值和注册的模型名不一致 @Prop({ type: [{ type: mongoose.Schema.Types.ObjectId, ref: 'ModuleSchema' }] }) modules: Module[];
修改后正确写法:
// 正确:ref和注册的模型名保持一致,推荐直接用类名的name属性避免拼写错误 @Prop({ type: [{ type: mongoose.Schema.Types.ObjectId, ref: Module.name }] }) modules: Module[];
- 还原populate调用
不需要手动传入Model实例,直接用原生写法即可:
findAll() { return this.moduleModule.find().populate('modules'); }
其他场景补充
如果你modules字段关联的是其他集合的模型,只需额外满足两个条件即可:
- 关联的模型已经在其所属模块的
MongooseModule.forFeature中完成注册 - 如果关联模型属于其他模块,要么在当前模块的
imports数组中引入对应模块,要么将关联模型的注册项添加到当前模块的MongooseModule.forFeature数组中。
内容的提问来源于stack exchange,提问作者Justin Spring
相关产品推荐
相关产品推荐

