Несколько баз данных из службы асинхронной конфигурации? - PullRequest
0 голосов
/ 05 июля 2019

Документация NestJS описывает, как определить несколько баз данных:

https://docs.nestjs.com/techniques/database#multiple-databases

А также использование службы конфигурации базы данных для асинхронной конфигурации:

https://docs.nestjs.com/techniques/database#async-configuration

Можно ли определить несколько баз данных из службы конфигурации async?

Экспериментально я попытался вернуть массив опций из моего сервиса:

class TypeOrmConfigService implements TypeOrmOptionsFactory {
  createTypeOrmOptions() {
    return [
      { ... },
      { ... }
    ];
  }
}

но не повезло с таким подходом.

1 Ответ

0 голосов
/ 05 июля 2019

Похоже, что для каждого соединения, которое вы хотите иметь, вам нужно будет создать отдельный экземпляр конфигурации.Я мог бы предложить какую-то фабрику, которая берет имя, и, возможно, ключ конфигурации для соединения с базой данных, а затем использовать фабрику, чтобы помочь вернуть ожидаемые значения.Таким образом, у документов есть фабрика, подобная

TypeOrmModule.forRootAsync({
  imports: [ConfigModule],
  useFactory: async (configService: ConfigService) => ({
    type: 'mysql',
    host: configService.getString('HOST'),
    port: configService.getString('PORT'),
    username: configService.getString('USERNAME'),
    password: configService.getString('PASSWORD'),
    database: configService.getString('DATABASE'),
    entities: [__dirname + '/**/*.entity{.ts,.js}'],
    synchronize: true,
  }),
  inject: [ConfigService],
});

. Вы можете создать аналогичную фабрику в соответствии с

const typeOrmFactory = (
  configName: string,
  entities: string[],
  databaseName?: string
) => (configService: ConfigService): TypeOrmModuleOptions => ({
  type: 'postgres', // whatever you use
  url: configService.get(configName), // dynamically change which connection you're working with based on the factory input
  name: databaseName || 'default',
  synchronize: true,
  entities // path to the entity/entities you are working with
});

Теперь в вашем app.module вы можете использовать фабрику следующим образом

@Module({
  imports: [
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      useFactory: typeOrmFactory('DATABASE_URL', ['some/path.ts']),
      inject: [ConfigService]
    }),
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      useFactory: typeOrmFactory('DATABASE_URL_2', ['some/other/path.ts'], 'secondaryDatabase'),
      inject: [ConfigServce]
    ],
})
export class AppModule {}

Убедитесь, что вы сообщаете Typescript, что возвращаете тип TypeOrmModuleOptions, в противном случае он сообщает, что функции несовместимы.Вы также можете сохранить большинство конфигов в сервисе конфигурации и переменных среды, если хотите.

...