Typescript 使用ClientsModule.registerAsync()时,无法访问从共享模块提供的模块导出的服务

Typescript 使用ClientsModule.registerAsync()时,无法访问从共享模块提供的模块导出的服务,typescript,microservices,nestjs,nestjs-config,Typescript,Microservices,Nestjs,Nestjs Config,上下文是我创建了一个共享配置模块,该模块导入多个配置模块,每个配置模块导出自己的服务,共享模块导出每个导入的模块,目前在我的应用程序中,我有一个导入共享配置模块的应用程序模块和一个导入共享配置模块的身份验证模块 在这个项目中,我使用的是nestjs微服务,我试图用registerAsync方法注册ClientsModule来访问我的auth模块中的auth config服务 目录体系结构: /** config/ - shared-config.module.ts - app/

上下文是我创建了一个共享配置模块,该模块导入多个配置模块,每个配置模块导出自己的服务,共享模块导出每个导入的模块,目前在我的应用程序中,我有一个导入共享配置模块的应用程序模块和一个导入共享配置模块的身份验证模块

在这个项目中,我使用的是nestjs微服务,我试图用
registerAsync
方法注册
ClientsModule
来访问我的auth模块中的auth config服务

目录体系结构:

/**
config/  
  - shared-config.module.ts
  - app/
     - app-config.service.ts
     - app-config.module.ts
  - auth/
     - auth-config.service.ts
     - auth-config.module.ts
  ... other config modules
- auth/
   - auth.module.ts
- app/
   - app.module.ts
*/
shared-config.module.ts:

@Module({
  imports: [AppConfigModule, MicroServiceAuthConfigModule, /* and other modules */],
  export: [AppConfigModule, MicroServiceAuthConfigModule, /* and other modules */]
})
export class SharedConfigModule {}
@Module({
    imports: [
        ConfigModule.forRoot({
           ... some config
        }),
    ],
    providers: [MicroServiceAuthConfigService],
    exports: [MicroServiceAuthConfigService],
})
export class MicroServiceAuthConfigModule {}
@Module({
  imports: [
    SharedConfigModule,
    ClientsModule.registerAsync([
      {
        name: 'AUTH_PACKAGE',
        inject: [MicroServiceAuthConfigService],
        useFactory: (authConfigService: MicroServiceAuthConfigService) => ({
          transport: Transport.GRPC,
          options: {
            url: authConfigService.url,
            package: authConfigService.package,
            protoPath: authConfigService.protoPath,
          },
        }),
      },
    ]),
  ],
  controllers: [AuthController],
  providers: [AuthService],
})
export class AuthModule {}
@Module({
  imports: [AuthModule, SharedConfigModule],
})
export class AppModule {}
auth-config.module.ts:

@Module({
  imports: [AppConfigModule, MicroServiceAuthConfigModule, /* and other modules */],
  export: [AppConfigModule, MicroServiceAuthConfigModule, /* and other modules */]
})
export class SharedConfigModule {}
@Module({
    imports: [
        ConfigModule.forRoot({
           ... some config
        }),
    ],
    providers: [MicroServiceAuthConfigService],
    exports: [MicroServiceAuthConfigService],
})
export class MicroServiceAuthConfigModule {}
@Module({
  imports: [
    SharedConfigModule,
    ClientsModule.registerAsync([
      {
        name: 'AUTH_PACKAGE',
        inject: [MicroServiceAuthConfigService],
        useFactory: (authConfigService: MicroServiceAuthConfigService) => ({
          transport: Transport.GRPC,
          options: {
            url: authConfigService.url,
            package: authConfigService.package,
            protoPath: authConfigService.protoPath,
          },
        }),
      },
    ]),
  ],
  controllers: [AuthController],
  providers: [AuthService],
})
export class AuthModule {}
@Module({
  imports: [AuthModule, SharedConfigModule],
})
export class AppModule {}
问题是我试图使用
MicroServiceAuthConfigService
在我的
AuthModule
中创建
ClientsModule

auth.module.ts:

@Module({
  imports: [AppConfigModule, MicroServiceAuthConfigModule, /* and other modules */],
  export: [AppConfigModule, MicroServiceAuthConfigModule, /* and other modules */]
})
export class SharedConfigModule {}
@Module({
    imports: [
        ConfigModule.forRoot({
           ... some config
        }),
    ],
    providers: [MicroServiceAuthConfigService],
    exports: [MicroServiceAuthConfigService],
})
export class MicroServiceAuthConfigModule {}
@Module({
  imports: [
    SharedConfigModule,
    ClientsModule.registerAsync([
      {
        name: 'AUTH_PACKAGE',
        inject: [MicroServiceAuthConfigService],
        useFactory: (authConfigService: MicroServiceAuthConfigService) => ({
          transport: Transport.GRPC,
          options: {
            url: authConfigService.url,
            package: authConfigService.package,
            protoPath: authConfigService.protoPath,
          },
        }),
      },
    ]),
  ],
  controllers: [AuthController],
  providers: [AuthService],
})
export class AuthModule {}
@Module({
  imports: [AuthModule, SharedConfigModule],
})
export class AppModule {}
app.module.ts:

@Module({
  imports: [AppConfigModule, MicroServiceAuthConfigModule, /* and other modules */],
  export: [AppConfigModule, MicroServiceAuthConfigModule, /* and other modules */]
})
export class SharedConfigModule {}
@Module({
    imports: [
        ConfigModule.forRoot({
           ... some config
        }),
    ],
    providers: [MicroServiceAuthConfigService],
    exports: [MicroServiceAuthConfigService],
})
export class MicroServiceAuthConfigModule {}
@Module({
  imports: [
    SharedConfigModule,
    ClientsModule.registerAsync([
      {
        name: 'AUTH_PACKAGE',
        inject: [MicroServiceAuthConfigService],
        useFactory: (authConfigService: MicroServiceAuthConfigService) => ({
          transport: Transport.GRPC,
          options: {
            url: authConfigService.url,
            package: authConfigService.package,
            protoPath: authConfigService.protoPath,
          },
        }),
      },
    ]),
  ],
  controllers: [AuthController],
  providers: [AuthService],
})
export class AuthModule {}
@Module({
  imports: [AuthModule, SharedConfigModule],
})
export class AppModule {}
因为我已经导入了SharedConfigModule,所以我应该在
useFactory
中访问MicroServiceAuthConfigService,但是我出现了以下错误:

Nest无法解析身份验证包(?)的依赖项。请做 确保索引[0]处的参数MicroServiceAuthConfigService为 在ClientsModule上下文中可用

可能的解决办法:

  • 如果MicroServiceAuthConfigService是一个提供程序,它是否是当前ClientsModule的一部分
  • 如果MicroServiceAuthConfigService是从单独的@模块导出的,该模块是否在ClientsModule中导入@模块({ 导入:[/*包含MicroServiceAuthConfigService的模块*/]})
奇怪的是,在我的应用程序模块中,我已经注入了
SharedConfigModule
,在我的文件
main.ts
中,我正在使用
app.get(MicroServiceAuthConfigService)
,它正在工作


那么我做错了什么呢?

在您的
客户端模块.registerAsync
中,您需要添加
导入
,其中包含导出
MicroServiceAuthConfigService
提供程序的模块的数组。看起来你特别需要

@模块({
进口:[
共享配置模块,
ClientsModule.registerAsync([
{
名称:'AUTH_PACKAGE',
导入:[MicroServiceAuthConfigModule],
inject:[MicroServiceAuthConfigService],
useFactory:(authConfigService:MicroServiceAuthConfigService)=>({
交通:transport.GRPC,
选项:{
url:authConfigService.url,
包:authConfigService.package,
protoPath:authConfigService.protoPath,
},
}),
},
]),
],
控制器:[AuthController],
提供者:[授权服务],
})
导出类AuthModule{}

谢谢!我直接在
注册表同步中导入了
SharedConfigModule
,因为我在AuthModule中只使用了
MicroServiceAuthConfigService
,但这是正确的方法