首页 > 解决方案 > NestJS如何在管道中访问抽象控制器中的存储库

问题描述

我有包含管道 CanGetPipe 的 BaseController ( Abstract )

export abstract class CanGetPipe implements PipeTransform {
  protected abstract readonly repository: Repository<IEntry>;
...

并为它混入

export const makeCanGetPipe = (repoName: any) =>
  mixin(
    class extends CanGetPipe {
      protected readonly repository = getConnection().getRepository<IEntity>(repoName);
    },
  );

BaseControlle 的 Get 方法如下所示:

  @Get('/:id')
  @UsePipes(makeCanGetPipe(REPOSITORY_NAME_FROM_CHILD_CONTROLLER))
  getOne(@ValidateData() validate: ValidateParam, @Param('id') id: number) {
    return this.Service.get(id, validate);
  }

我如何REPOSITORY_NAME_FROM_CHILD_CONTROLLER在子控制器中设置而不是从 BaseController 继承?
或者,我如何能够访问分配给 BaseController 的管道中子控制器的存储库(服务、依赖项)?

标签: typescriptnestjs

解决方案


我认为您可以使用以下组合:

  1. @SetMetadata('repoName', YOUR_VALUE)在你的孩子班上
  2. 而不是管道 - 使用 Guardconst repoName = this.reflector.get<string>('repoName', context.getClass());

这应该可以解决问题,您将能够为您的 BaseGuard 获得自定义 repo :)


推荐阅读