You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
  }
}

验证要点

  1. 确保MongooseModule.forRootAsync(MongoProviderModule中)的connectionName与MongooseModule.forFeature(UserModule中)的第二个参数一致
  2. @InjectModel的第二个参数必须和上述连接名完全匹配

内容的提问来源于stack exchange,提问作者tnaluat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 10:45:38