Nest Js monorepo shared lib инъекция - PullRequest
0 голосов
/ 07 мая 2020

У меня есть приложение Nest JS с парой микросервисов, хранящихся в одном репозитории (подход монорепозитория).

AccessControl модуль хранится в libs, он должен использоваться несколькими микросервисами. В нем есть AccessControlModule.ts файл

@Global()
@Module({
  providers: [
    {
      provide: 'CONNECTION1',
      useFactory: (configService: ConfigService) => {
        return ClientProxyFactory.create(
          configService.getRMQConnection(),
        );
      },
      inject: [ConfigService],
    },
    ACGuard,
  ],
  exports: [ACGuard],
  imports: [ConfigModule],
})
export class AccessControlModule implements OnModuleDestroy {
  constructor(
    @Inject('CONNECTION1')
    protected readonly orgConnection: ClientProxy,
  ) {}

  onModuleDestroy(): any {
    this.orgConnection.close();
  }
}

Этот файл отвечает за описание модуля, он создает соединение для другого микросервиса и предоставляет его сервису ACGuard. ACGuard.ts:

@Injectable()
export class ACGuard implements CanActivate {
  constructor(
    private readonly reflector: Reflector,
    private config: ConfigService,
    @Inject('CONNECTION1')
    private readonly userConnection: ClientProxy;
  ) {}

  public async canActivate(context: ExecutionContext): Promise<boolean> {
   // do some stuff 
  }
}

Эта часть сама по себе хорошо компилируется и логически работает нормально. Проблема начинается, когда я пытаюсь внедрить его в один из микросервисов. Я делаю это как обычно, добавляя AccessControlModule в часть import какого-нибудь модуля. Например, KioskModule:

@Module({
  imports: [
    ...
    AccessControlModule
  ],
  providers: [
    ...
    KiosksResolver
  ]
})
export class KiosksModule {}

Поскольку AccessControlModule помечен как Global и экспортирует ACGuard, я ожидаю, что он будет внедряться в моих провайдеров.

@Resolver('Kiosk')
export class KiosksResolver {
  ...

  @UseGuards(ACGuard)
  @Query()
  kiosks() {
    // ...
  }

   ... 
}

Но это код падает на шаг компиляции с ошибкой:

[Nest] 9964 - 05.07.2020, 21:33:02 [ExceptionHandler] Nest не может разрешить зависимости ACGuard (Reflector, ConfigService,?). Убедитесь, что аргумент CONNECTION1 с индексом [2] доступен в контексте KiosksModule.

С другой стороны, если я вставлю его в конструктор KiosksResolver, приложение будет успешно построено.

Буду признателен за любую помощь и идеи, спасибо!

1 Ответ

0 голосов
/ 08 мая 2020

Способ, которым я решил эту проблему, заключался в экспорте CONNECTION1 провайдера в AccessControlModule.ts.

@Module({
  providers: [
    {
      provide: 'CONNECTION1',
      useFactory: (configService: ConfigService) => {
        return ClientProxyFactory.create(
          configService.getRMQConnection(),
        );
      },
      inject: [ConfigService],
    },
    ACGuard,
  ],
  exports: [ACGuard, 'CONNECTION1'],
  imports: [ConfigModule],
})
export class AccessControlModule ...

С этим экспортом KioskModule создает собственный ACGuard, но предоставляет здесь соединение, экспортированное из AccessControlModule. Мне неясно, почему KioskModule не получает собранный экземпляр ACGuard, экспортированный из AccessControlModule, но попробуйте собрать его еще раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...