首页 > 解决方案 > Nestjs 和控制器中的服务继承

问题描述

我正在尝试为用户模块编写一些通用代码,这将很容易扩展。我遇到了依赖问题。我有 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]
})

任何想法?谢谢!

标签: typescriptnestjs

解决方案


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

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

您可以像这样更新模块:

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

推荐阅读