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

NestJS无法解析AuthService依赖,求助解决循环依赖问题

NestJS依赖注入错误排查与修复方案

问题现象

运行时出现错误:Nest can't resolve dependencies of the AuthService (?),提示UsersService在AuthModule上下文不可用。已尝试使用forwardRef处理循环依赖,但问题仍未解决。

错误栈信息

Error: Nest can't resolve dependencies of the AuthService (?). Please make sure that the argument UsersService at index [0] is available in the AuthModule context.

Potential solutions:
- Is AuthModule a valid NestJS module?
- If UsersService is a provider, is it part of the current AuthModule?
- If UsersService is exported from a separate @Module, is that module imported within AuthModule?
  @Module({
    imports: [ /* the Module containing UsersService */ ]
  })

    at Injector.lookupComponentInParentModules (C:\Users\OSMAN MERT\Desktop\candy\node_modules\@nestjs\core\injector\injector.js:244:19)   
    at Injector.resolveComponentInstance (C:\Users\OSMAN MERT\Desktop\candy\node_modules\@nestjs\core\injector\injector.js:197:33)
    at resolveParam (C:\Users\OSMAN MERT\Desktop\candy\node_modules\@nestjs\core\injector\injector.js:117:38)
    at async Promise.all (index 0)
    at Injector.resolveConstructorParams (C:\Users\OSMAN MERT\Desktop\candy\node_modules\@nestjs\core\injector\injector.js:132:27)
    at Injector.loadInstance (C:\Users\OSMAN MERT\Desktop\candy\node_modules\@nestjs\core\injector\injector.js:58:13)
    at Injector.loadProvider (C:\Users\OSMAN MERT\Desktop\candy\node_modules\@nestjs\core\injector\injector.js:85:9)
    at C:\Users\OSMAN MERT\Desktop\candy\node_modules\@nestjs\core\injector\instance-loader.js:49:13
    at async Promise.all (index 3)
    at InstanceLoader.createInstancesOfProviders (C:\Users\OSMAN MERT\Desktop\candy\node_modules\@nestjs\core\injector\instance-loader.js:48:9)

相关代码文件

users.service.ts

@Injectable()
export class UsersService {
  constructor(
  @InjectRepository(UserEntity) private repo: Repository<UserEntity>) {}
  
  async create(createUserDto: CreateUserDto):Promise<UserEntity> {
    const user = new UserEntity();
    user.firstname = createUserDto.firstname;
    user.lastname = createUserDto.lastname;
    user.email = createUserDto.email;
    
    return await this.repo.save(user) 
  }

  async findAll():Promise<UserEntity[]> {
    return await this.repo.find();
  }

  async findOne(id: number):Promise<UserEntity> {
    return await this.repo.findOne({
      select:['id','firstname','lastname',"email"],
      where:{id}
    });
  }
}

users.module.ts

@Module({
  imports:[TypeOrmModule.forFeature([UserEntity]),PassportModule,forwardRef(() =>AuthModule)],
  controllers: [UsersController],
  providers: [UsersService],
  exports:[UsersService]
})
export class UsersModule {}

users.entity.ts

@Entity()
export class UserEntity {
    @PrimaryGeneratedColumn()
    id: number;
   
    @Column()
    firstname: string;

    @Column()
    lastname: string;

    @Column()
    email:string;
}

auth.service.ts

@Injectable()
export class AuthService {
    constructor(@Inject('UsersService') private  userService:UsersService){}

    async validateUser(id:number,password:string){
        const user = await this.userService.findOne(id)
        if(user.id === id){
            return user
        }
        return null
    }
}

auth.module.ts

@Module({
  imports:[forwardRef(() => UsersModule)],
  providers: [AuthService,UsersService],
  exports:[AuthService]
})
export class AuthModule {}

问题根源及修复方案

  1. 移除AuthModule中重复声明的UsersService
    AuthModule的providers数组中直接添加了UsersService,但该服务已在UsersModule中声明并导出。重复声明会导致Nest创建两个独立实例,且当前实例缺少TypeOrmRepository依赖,引发注入失败。
    修复后auth.module.ts:

    @Module({
      imports:[forwardRef(() => UsersModule)],
      providers: [AuthService], // 移除UsersService
      exports:[AuthService]
    })
    export class AuthModule {}
    
  2. 删除AuthService中冗余的@Inject装饰器
    通过模块导入获取服务时,无需使用字符串令牌的@Inject装饰器,直接注入类即可。错误的令牌会导致Nest无法匹配正确的服务实例。
    修复后auth.service.ts:

    @Injectable()
    export class AuthService {
        constructor(private userService: UsersService){} // 移除@Inject('UsersService')
    
        async validateUser(id:number,password:string){
            const user = await this.userService.findOne(id)
            if(user.id === id){
                return user
            }
            return null
        }
    }
    
  3. 保留正确的forwardRef配置
    当前UsersModule和AuthModule的forwardRef双向导入配置无误,可继续保留,避免循环依赖导致的初始化死锁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:27:24