使用forwardref的Nestjs循环依赖

问题描述 投票:0回答:4

大家好,我在 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 */ ]
    })
    

为什么我会出现循环依赖!!

typescript nestjs circular-dependency
4个回答
3
投票

这个答案不能帮助你解决问题,但可以让你更好地理解模块间的连接

您可以集成nestjs-spelunker

有时您想要可视化模块的相互依赖关系,以便您可以更好地推理它们。 SpelunkerModule 有一个图形方法,它通过生成一个双向链接图来构建在 explore 方法的输出上,其中每个节点代表一个模块,每条边都链接到该模块的依赖项或从属项。


0
投票

解决方案是在构造函数中使用@Inject()(我在哪里导入服务) 您可以在文档中查看更多内容


0
投票

可以在构造函数中使用:

constructor(
  @Inject(forwardRef(() => TestService))
  privado testService: TestService,
)

您也可以使用:

constructor(
  @Inject(REQUEST)
  privado testService: TestService,
)

虽然我认为使用第一个更好,但这也取决于你使用的是什么。

如果您使用管道,我建议您检查此问题:https://github.com/nestjs/nest/issues/4367


-2
投票

尽量避免从其他服务调用服务。遵循减少模块间连接的路径

© www.soinside.com 2019 - 2024. All rights reserved.