NestJS报错无法解析UserPreferencesService依赖如何排查解决
NestJS Mongoose 依赖注入报错修复
报错信息
项目启动时抛出如下依赖解析错误:
Nest can't resolve dependencies of the UserPreferencesService (?). Please make sure that the argument UserPreferencesSchemaModel at index [0] is available in the UserPreferencesModule context.
初步定位:注释user-preferences.module.ts中以下两行配置后项目可正常运行:
controllers: [UserPreferencesController], providers: [UserPreferencesService],
根因
@InjectModel() 传入的注入令牌和 MongooseModule.forFeature() 注册Schema时配置的名称不匹配,Nest IoC容器无法找到对应的模型提供者:
- 服务层注入时使用的令牌为
'UserPreferencesSchema' - 模块层注册Schema时配置的name字段为
'UserPreferences'
Nest的Mongoose模块会自动以{配置name}Model为令牌注册模型提供者,令牌不一致就会触发当前报错。
修复方法
修改user-preferences.service.ts中的@InjectModel()参数,和模块注册的name值保持完全一致:
@Injectable() export class UserPreferencesService { constructor( // 将传入值从 'UserPreferencesSchema' 改为 'UserPreferences' @InjectModel('UserPreferences') private readonly UserPreferencesModel: Model<UserPreferencesInterface>, ) {} // 其余业务代码保持不变 public async postUserPreferences(newUserPreferences: any): Promise<any> { const userPreferences = await new this.UserPreferencesModel( newUserPreferences, ); return userPreferences.save(); } }
额外排查点
如果修改后仍存在同类报错,可按以下顺序排查:
- 确认根模块中
MongooseModule.forRoot()数据库连接配置正确,没有拼写错误 - 确认
UserPreferencesModule已正确import到根模块AppModule的imports数组中 - 多模块共享模型场景下,需要在定义Schema的模块的exports数组中导出
MongooseModule,再在使用模型的模块中import该业务模块 - 检查是否存在服务、模块之间的循环依赖,存在的话使用
forwardRef处理
内容的提问来源于stack exchange,提问作者DavSev
相关产品推荐
相关产品推荐

