У меня есть приложение 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
, приложение будет успешно построено.
Буду признателен за любую помощь и идеи, спасибо!