NestJS循环依赖场景下AuthUserController服务无法实例化问题
NestJS循环依赖导致AuthUserController服务未实例化的解决方法
问题根源
你仅在AuthService和UserService的构造函数中使用了forwardRef注入依赖,但模块的providers数组中未对这两个循环依赖的服务做对应声明。当控制器单独注入其中一个服务时,Nest可以通过构造函数的forwardRef延迟加载依赖;但当AuthUserController同时注入两个循环依赖的服务时,Nest需要在模块层面明确知晓这两个服务的循环依赖关系,才能正确处理实例化顺序,否则会导致服务无法正常实例化。
修复方案
修改模块配置,在providers中用forwardRef包装AuthService和UserService的注册:
import { forwardRef, Module } from '@nestjs/common'; import { AuthUserController, AuthController, UserController } from './controllers'; import { AuthService } from './auth.service'; import { UserService } from './user.service'; @Module({ imports: [], controllers: [ AuthUserController, AuthController, UserController, ], providers: [ forwardRef(() => AuthService), forwardRef(() => UserService), ], }) export class YourModuleName {}
原理说明
循环依赖的处理需要在依赖注入的两个层面都做配置:
- 服务构造函数中:用
@Inject(forwardRef(() => XXXService))告诉Nest延迟解析该依赖 - 模块providers中:用
forwardRef包装服务注册,让Nest在初始化时识别这是一个循环依赖的服务,调整实例化顺序,避免出现未初始化的情况
内容的提问来源于stack exchange,提问作者Zephyr
相关产品推荐
相关产品推荐

