Typescript 使用ClientsModule.registerAsync()时,无法访问从共享模块提供的模块导出的服务
上下文是我创建了一个共享配置模块,该模块导入多个配置模块,每个配置模块导出自己的服务,共享模块导出每个导入的模块,目前在我的应用程序中,我有一个导入共享配置模块的应用程序模块和一个导入共享配置模块的身份验证模块 在这个项目中,我使用的是nestjs微服务,我试图用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/
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
,但这是正确的方法