Nestjs 自定义配置服务在注入其他模块服务时出错

时间:2021-06-02 10:52:43

标签: nestjs nestjs-config

我想解释一下我想做什么。 我想从数据库获取数据库配置并连接到它。最好举个例子更好理解。我有 3 个数据库 A、B、C 在 DB A 中存储 DB B 和 C 配置信息,例如用户名、密码和 dbName(BD B 和 BD C 的用户名等)。我在数据库(B 和 C)中都有用户,例如 David 身份验证凭据在数据库 B 中,而 Justin 身份验证凭据在数据库 C 中,当 David 想要对后端进行身份验证时应该连接到 DB B,然后获取他的凭据

所以我写了一些代码,但出现错误

我写的代码:

<块引用>

在 app.module.ts 中

<块引用>

UsersModule 有一个实体用于存储 DB 配置 => DB A PlayersModule 有一个用于存储用户凭据的实体 => DB B(David auth 凭据保存在此处)


    @Module({
      imports: [
        TypeOrmModule.forRoot(),
        TypeOrmModule.forRootAsync({
          useClass: DynamicDbConfigService,
        }),
        ConfigModule.forRoot(),
        UsersModule,
        PlayersModule,
        DynamicDbConfigModule,
      ],
      controllers: [AppController],
      providers: [AppService],
    })
    export class AppModule {}

<块引用>

这是ormconfig js文件


    module.exports = {
      name: 'default',
      type: 'mysql',
      host: process.env.DB_HOST,
      port: process.env.DB_PORT,
      username: process.env.DB_USERNAME,
      password: process.env.BD_PASSWORD,
      database: process.env.DB_NAME,
      entities: ['dist/**/*.entity{.ts,.js}'],
      synchronize: true,
    };

<块引用>

我有两个文件用于动态获取数据库配置

<块引用>

在动态-db-config.service.ts

<块引用>

我使用服务 (UsersService) 根据 request.params(发送数据库名称)获取数据库凭据


    @Injectable({ scope: Scope.REQUEST })
    export class DynamicDbConfigService implements TypeOrmOptionsFactory {
      constructor(
        @Inject(REQUEST) private readonly request: Request,
        private usersService: UsersService,
      ) {}
    
      createTypeOrmOptions(
        connectionName?: string,
      ): Promise<TypeOrmModuleOptions> | TypeOrmModuleOptions {
        return this.usersService.getServerDetail(this.request.params.serverName);
      }
    }

<块引用>

dynamic-db-config.module.ts


    @Module({
      imports: [UsersModule],
      providers: [DynamicDbConfigService],
      exports: [DynamicDbConfigService],
    })
    export class DynamicDbConfigModule {}

<块引用>

users.service.ts


    async getServerDetail(serverName): Promise<TypeOrmModuleOptions> {
        const dbDetail = await this.userRepository.findOne({
          where: { dbName: serverName },
        });
        return {
          name: 'dynamicDB',
          database: dbDetail.dbName,
          host: 'localhost',
          username: 'bla bla bla',
          password: 'bla bla bla',
          type: 'mysql',
          port: 3306,
        };
      }

<块引用>

这是 users.module.ts


    @Module({
      imports: [TypeOrmModule.forFeature([User])],
      controllers: [UsersController],
      providers: [UsersService],
      exports: [UsersService],
    })
    export class UsersModule {}

因此,当我想运行此代码时,在 dynamic-db-config.service.ts 中出现 usersService 错误

<块引用>

错误是:

```
Error: Nest can't resolve dependencies of the DynamicDbConfigService (REQUEST, ?). Please make sure that the argument UsersService at index [1] is available in the TypeOrmCoreModule context.

Potential solutions:
- If UsersService is a provider, is it part of the current TypeOrmCoreModule?
- If UsersService is exported from a separate @Module, is that module imported within TypeOrmCoreModule?
  @Module({
    imports: [ /* the Module containing UsersService */ ]`enter code here`
  })

```

我哪里做错了?

0 个答案:

没有答案