大家好,我在 Nestjs 上遇到循环依赖错误 我尝试使用
forwardref
但这对我没有帮助
// AuthModule
@Module({
imports: [
forwardRef(() => UserModule),
JwtModule.register({
global: true,
secret: process.env.TOKEN_SECRET,
signOptions: { expiresIn: process.env.TOKEN_DURATION },
}),
],
providers: [AuthService, AuthGuard],
controllers: [AuthController],
exports: [AuthService],
})
export class AuthModule {}
// UserModule
@Module({
imports: [forwardRef(() => AuthModule)],
controllers: [UserController],
providers: [UserService],
exports: [UserService],
})
export class UserModule {}
在服务中我正在像这样访问其他服务
private readonly authService: AuthService,
== 命令错误== [Nest] 2788 - 06/10/2023, 12:56:50 PM 日志 [InjectorLogger] Nest 遇到未定义的依赖项。这可能是由于循环导入或缺少依赖项声明造成的。 [Nest] 2788 - 2023 年 6 月 10 日下午 12:56:50 错误 [ExceptionHandler] Nest 无法解析 UserService(PrismaService、?、CONFIGURATION(app))的依赖项。请确保索引 [1] 处的参数依赖项在 UserModule 上下文中可用。
潜在的解决方案:
UserModule 是有效的 NestJS 模块吗?
如果依赖项是提供者,它是当前 UserModule 的一部分吗?
如果从单独的 @Module 导出依赖项,则该模块是否在 UserModule 中导入?
@Module({
imports: [ /* the Module containing dependency */ ]
})
为什么我会出现循环依赖!!
这个答案不能帮助你解决问题,但可以让你更好地理解模块间的连接
您可以集成nestjs-spelunker
有时您想要可视化模块的相互依赖关系,以便您可以更好地推理它们。 SpelunkerModule 有一个图形方法,它通过生成一个双向链接图来构建在 explore 方法的输出上,其中每个节点代表一个模块,每条边都链接到该模块的依赖项或从属项。
解决方案是在构造函数中使用@Inject()(我在哪里导入服务) 您可以在文档中查看更多内容
可以在构造函数中使用:
constructor(
@Inject(forwardRef(() => TestService))
privado testService: TestService,
)
您也可以使用:
constructor(
@Inject(REQUEST)
privado testService: TestService,
)
虽然我认为使用第一个更好,但这也取决于你使用的是什么。
如果您使用管道,我建议您检查此问题:https://github.com/nestjs/nest/issues/4367
尽量避免从其他服务调用服务。遵循减少模块间连接的路径