NestJS中@InjectModel无法解析UserModel依赖问题求助
NestJS @InjectModel 依赖解析失败解决方法
问题场景
在UserRepository中通过@InjectModel()注入UserModel时出现依赖无法解析的错误,已通过独立的MongoProviderModule初始化数据库并导入到UserModule中,尝试显式导出Mongo提供者后问题仍未解决。
相关代码
MongoDB提供者模块
@Module({ imports: [ MongooseModule.forRootAsync({ imports: [MongoConfigModule], useFactory: async (mongoConfigService: MongoConfigService) => ({ uri: mongoConfigService.dbUrl, useNewUrlParser: true, isGlobal: true, }), connectionName: 'user', inject: [MongoConfigService], }), ], }) export class MongoProviderModule {}
User Schema
import { Document } from 'mongoose'; import { Schema, Prop, SchemaFactory } from '@nestjs/mongoose'; export type UserDocument = User & Document; @Schema() export class User { @Prop() userId: string; @Prop() email: string; } export const UserSchema = SchemaFactory.createForClass(User);
User Repository(原错误代码)
import { Injectable } from '@nestjs/common'; import { InjectModel, Model } from '@nestjs/mongoose'; import { FilterQuery } from 'mongoose'; import { User, UserDocument } from './user.schema'; @Injectable() export class UserRepository { constructor(@InjectModel(User.name) private userModel: Model<UserDocument>) {} async findOne(userFilterQuery: FilterQuery<User>): Promise<User> { return this.userModel.findOne(userFilterQuery); } }
User模块
@Module({ imports: [ MongoProviderModule, MongooseModule.forFeature( [{ name: User.name, schema: UserSchema }], 'user', ), ], controllers: [UserController], providers: [UserService, UserRepository], }) export class UserModule {}
App模块
@Module({ imports: [AppConfigModule, UserModule], controllers: [AppController], providers: [AppService], }) export class AppModule {}
错误信息
Nest can't resolve dependencies of the UserRepository (?). Please make sure that the argument UserModel at index [0] is available in the UserModule context. Potential solutions: - If UserModel is a provider, is it part of the current UserModule? - If UserModel is exported from a separate @Module, is that module imported within UserModule?
问题原因
使用了命名数据库连接(connectionName: 'user'),但@InjectModel注入时未指定对应的连接名称,导致Nest无法匹配到正确的Model实例。
解决步骤
修改UserRepository中的@InjectModel装饰器,在第二个参数中指定连接名:
@Injectable() export class UserRepository { // 添加连接名参数 'user' constructor(@InjectModel(User.name, 'user') private userModel: Model<UserDocument>) {} async findOne(userFilterQuery: FilterQuery<User>): Promise<User> { return this.userModel.findOne(userFilterQuery); } }
验证要点
- 确保
MongooseModule.forRootAsync(MongoProviderModule中)的connectionName与MongooseModule.forFeature(UserModule中)的第二个参数一致 @InjectModel的第二个参数必须和上述连接名完全匹配
内容的提问来源于stack exchange,提问作者tnaluat
相关产品推荐
相关产品推荐

