NestJS同一模块内多个服务循环依赖报错该如何解决?
问题原因
你遇到的报错是循环依赖导致的:PostService与PostCacheService互相直接注入对方,Nest依赖注入容器在实例化服务时,需要先完成依赖的实例化,而两个服务的实例化互相依赖对方已经完成实例化,就会陷入死锁,抛出依赖无法解析的错误。
修复方案
有两种可行的修复方式:
方案1:使用Nest官方提供的forwardRef前向引用(快速解决)
forwardRef允许依赖注入容器在还未完成某个类的实例化时,先获取它的引用,从而解开循环死锁。你需要修改两个服务的注入代码,注意forwardRef需要从@nestjs/core包中导入:
首先修改PostService的构造函数中PostCacheService的注入逻辑:
import { forwardRef, Inject } from '@nestjs/core'; constructor( @InjectRepository(Post) private readonly postRepository: postRepository, @InjectRepository(User) private readonly userRepository: UserRepository, @InjectRepository(Comment) private readonly commentRepository: EntityRepository<Comment>, private readonly logger: Logger, // 用forwardRef包裹目标类 @Inject(forwardRef(() => PostCacheService)) private readonly postCacheService: PostCacheService, ) {}
再修改PostCacheService的构造函数中PostService的注入逻辑:
import { forwardRef, Inject } from '@nestjs/core'; constructor( @Inject(CACHE_MANAGER) private cacheManager: Cache, private logger: Logger, @Inject(forwardRef(() => PostService)) private readonly postService: PostService, ) {}
方案2:重构代码消除循环依赖(长期推荐)
循环依赖会提高代码的维护成本,有条件的话可以把两个服务共用的逻辑抽离为第三个独立服务(比如PostCoreService),让PostService和PostCacheService都只依赖这个新的公共服务,不再互相依赖,从根本上解决问题。
单个模块使用多服务的说明
单个Nest模块完全支持同时使用多个服务,你只需要把用到的服务都放到模块的providers数组中即可,本次报错和使用多服务没有关系,完全是循环依赖导致的。
内容的提问来源于stack exchange,提问作者Rasool Khan
相关产品推荐
相关产品推荐

