我的NestJS应用程序具有多个微服务存储在单个存储库中(monorepo方法)。
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,9:33:02 PM ExceptionHandler Nest不能解决ACGuard的依赖关系(Reflector,ConfigService,?)请确保索引2处的参数CONNECTION1在KiosksModule上下文中可用。
另一方面,如果我将它注入KiosksResolver的构造函数中,应用程序就会成功构建。
我将感谢任何帮助和想法,谢谢!
发布于 2020-05-08 16:03:00
我解决这个问题的方法是在AccessControlModule.ts中导出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没有从AccessControlModule导出ACGuard的构建实例,而是再次构建它。
https://stackoverflow.com/questions/61665433
复制相似问题