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 {}
问题根源及修复方案
移除AuthModule中重复声明的UsersService
AuthModule的providers数组中直接添加了UsersService,但该服务已在UsersModule中声明并导出。重复声明会导致Nest创建两个独立实例,且当前实例缺少TypeOrmRepository依赖,引发注入失败。
修复后auth.module.ts:@Module({ imports:[forwardRef(() => UsersModule)], providers: [AuthService], // 移除UsersService exports:[AuthService] }) export class AuthModule {}删除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 } }保留正确的forwardRef配置
当前UsersModule和AuthModule的forwardRef双向导入配置无误,可继续保留,避免循环依赖导致的初始化死锁。
内容的提问来源于stack exchange,提问作者Mert Altintas
相关产品推荐
相关产品推荐

