0

やりたいことを説明したい。DB からデータベース構成を取得して接続したい。理解を深めるために例を挙げたほうがよいでしょう。DB Aには3つのデータベースA、B、Cがあり、DB BおよびCには、userName、password、およびdbName(BD BおよびBD CのuserNameなど)などの構成情報が格納されています。私は両方の DB (B と C) にユーザーを持っています。たとえば、David の認証資格情報はデータベース B にあり、Justin の認証資格情報はデータベース C にあります

だから私はいくつかのコードを書いたが、エラーが発生する

私の書いたコード:

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構成を動的に取得するための2つのファイルがあります

dynamic-db-config.service.ts で

サービス (UsersService) を使用して、request.paramsに基づいて DB 資格情報を取得します(DB 名を送信します)


    @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`
  })

```

どこで私は間違えましたか?

4

0 に答える 0