【问题标题】:Service inheritance in Nestjs and controllersNestjs 和控制器中的服务继承
【发布时间】:2020-09-09 17:29:26
【问题描述】:

我正在尝试为用户模块编写一些通用代码,这将很容易扩展。 我遇到了依赖问题。我有 UserService、用户实体、ExtendedUserService 和 ExtendedUserModule 和 ExtendedUserController。

我想定义 ExtendedUserController 将接收扩展 typeof UserService 的服务(因为我希望这个控制器在模块中使用,并且在保存时我想使用任何相关服务保存更多信息)。

export class EmailUserController {
    constructor(
        private readonly emailService: UserService
    ) {

如果这样做,我在发送 ExtendedUserService 时会遇到依赖问题,即使它扩展了 UserService。

Nest 无法解析 EmailUserController (?) 的依赖关系。请确保索引 [0] 处的参数 UserService 在 EmailUserModule 上下文中可用。

模块看起来是这样的:

@Module({
    imports: [
        RoleModule,
        TypeOrmModule.forFeature([EmailUser]),
        JwtModule.register({
            secret: jwtConstants.secret,
            signOptions: { expiresIn: '100min' },
        })
    ],
    providers: [
        EmailUserService, // Extends UserService
        {
            provide: 'CONFIG_OPTIONS',
            useValue: options,
        },
    ],
    exports: [EmailUserService],
    controllers: [EmailUserController]
})

有什么想法吗? 谢谢!

【问题讨论】:

  • 您能说明一下您是如何发送 ExtendedUserService 的吗?
  • @Porcellus 我编辑了问题,检查一下:)

标签: typescript nestjs


【解决方案1】:

NestJS 所做的是尝试解决依赖关系,是获取提供确切类的东西——而不是满足相同接口的东西,如果它考虑到扩展就会出现这种情况。这会特别令人困惑,因为这可能适用于多个类。

对此的标准解决方案是使用自定义类提供程序(请参阅here)。

您可以像这样更新模块:

  providers: [
    EmailUserService,
    {
      provide: UserService,
      useClass: EmailUserService, // Extends UserService
    },
    {
      provide: 'CONFIG_OPTIONS',
      useValue: options,
    },
  ],

【讨论】:

  • 谢谢!就像一个魅力 :) 小编辑 - 仍然需要提供 EmailUserService 所以 Nest 将加载它的依赖项 providers: [ EmailUserService, { provide: 'UserService', useClass: EmailUserService, // Extends UserService }, { provide: 'CONFIG_OPTIONS', useValue: options, } ]
【解决方案2】:

确保您在 EmailUserModule 中导入了 UserModule 并确保将UserService 放入providers 部分UserModule

【讨论】:

  • 但我想使用 EmailUserService,而不是 UserService。如果我要导入 UserService,它将被使用,不是吗?
猜你喜欢
  • 2016-03-29
  • 2022-08-09
  • 1970-01-01
  • 2021-06-23
  • 2016-05-14
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多