首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NestJs monorepo共享库注入

NestJs monorepo共享库注入
EN

Stack Overflow用户
提问于 2020-05-07 18:45:58
回答 1查看 1.2K关注 0票数 2

我的NestJS应用程序具有多个微服务存储在单个存储库中(monorepo方法)。

AccessControl模块存储在libs中,它应该跨多个微服务共享。它有AccessControlModule.ts文件

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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

代码语言:javascript
复制
@Module({
  imports: [
    ...
    AccessControlModule
  ],
  providers: [
    ...
    KiosksResolver
  ]
})
export class KiosksModule {}

由于AccessControlModule标记为Global并导出ACGuard,所以我希望它可以注入到我的提供程序中。

代码语言:javascript
复制
@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的构造函数中,应用程序就会成功构建。

我将感谢任何帮助和想法,谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-08 16:03:00

我解决这个问题的方法是在AccessControlModule.ts中导出AccessControlModule.ts提供程序。

代码语言:javascript
复制
@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的构建实例,而是再次构建它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61665433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档