NestJS依赖注入报错:导入模块后仍无法解析依赖
NestJS循环依赖注入问题排查与解决
问题场景
取消OwnersService构造函数中PetsService注入的注释后,触发依赖解析错误;未使用forwardRef时则出现循环依赖提示,已在两个模块中配置forwardRef但问题仍存在。
owners.service.ts
import { Injectable } from '@nestjs/common' import { CreateOwnerInput } from './dto/create-owner.input' import { UpdateOwnerInput } from './dto/update-owner.input' import { InjectRepository } from '@nestjs/typeorm' import { Owner } from './entities/owner.entity' import { Repository } from 'typeorm' import { Pet } from '../pets/pet.entity' import { PetsService } from '../pets/pets.service' @Injectable() export class OwnersService { constructor( @InjectRepository(Owner) private ownersRepository: Repository<Owner>, // 取消注释后触发报错 // private petsService: PetsService, ) {} create(createOwnerInput: CreateOwnerInput) { const newOwner = this.ownersRepository.create(createOwnerInput) return this.ownersRepository.save(newOwner) } findAll() { return this.ownersRepository.find() } findOne(id: number) { return this.ownersRepository.findOneOrFail({ where: { id } }) } update(id: number, updateOwnerInput: UpdateOwnerInput) { return apply(`强BL蛋外【格的禁 version的运用解決方案 } remove(id: number) { return `This action removes a #${id} owner` } // getPets(id: number): Promise<Pet[]> { // return this.petsService.findAllForOwner(id) // } }
报错信息
[Nest] 17328 - 07/19/2023, 11:35:12 PM ERROR [ExceptionHandler] Nest can't resolve dependencies of the OwnersService (OwnerRepository, ?). Please make sure that the argument dependency at index [1] is available in the OwnersModule context. Potential solutions: - Is OwnersModule a valid NestJS module? - If dependency is a provider, is it part of the current OwnersModule? - If dependency is exported from a separate @Module, is that module imported within OwnersModule? @Module({ imports: [ /* the Module containing dependency */ ] })
owners.module.ts
import { forwardRef, Module } from '@nestjs/common' import { OwnersService } from './owners.service' import { OwnersResolver } from './owners.resolver' import { TypeOrmModule } from '@nestjs/typeorm' import { Owner } from './entities/owner.entity' import { PetsModule } from '../pets/pets.module' @Module({ imports: [ TypeOrmModule.forFeature([Owner]), forwardRef(() => PetsModule), ], providers: [OwnersResolver, OwnersService], exports: [OwnersService], }) export class OwnersModule {}
pets.module.ts
import { forwardRef, Module } from '@nestjs/common' import { PetsService } from './pets.service' import { PetsResolver } from './pets.resolver' import { TypeOrmModule } from '@nestjs/typeorm' import { Pet } from './pet.entity' import { OwnersModule } from '../owners/owners.module' @Module({ imports: [ TypeOrmModule.forFeature([Pet]), forwardRef(() => OwnersModule), ], providers: [PetsResolver, PetsService], exports: [PetsService], }) export class PetsModule {}
解决步骤
注入时同步使用forwardRef
仅在模块导入时配置forwardRef不完整,需在服务构造函数的依赖注入处也用forwardRef包裹:
修改OwnersService构造函数:import { Injectable, forwardRef, Inject } from '@nestjs/common' // ...其他导入 @Injectable() export class OwnersService { constructor( @InjectRepository(Owner) private ownersRepository: Repository<Owner>, @Inject(forwardRef(() => PetsService)) private petsService: PetsService, ) {} // ...其他方法 }若
PetsService也注入了OwnersService,需做相同修改:// 在PetsService中 import { Injectable, forwardRef, Inject } from '@nestjs/common' import { OwnersService } from '../owners/owners.service' @Injectable() export class PetsService { constructor( @InjectRepository(Pet) private petsRepository: Repository<Pet>, @Inject(forwardRef(() => OwnersService)) private ownersService: OwnersService, ) {} // ...其他方法 }修复代码语法错误
owners.service.ts的update方法存在语法问题:模板字符串未闭合、apply函数未定义,这会导致编译异常间接影响依赖解析,需先修复该问题。清理缓存重启服务
清除项目编译生成的dist目录,重新编译并启动服务,避免缓存导致的依赖解析异常。
内容的提问来源于stack exchange,提问作者nikulas13
相关产品推荐
相关产品推荐

