来自异步配置服务的多个数据库?

时间:2019-07-05 08:51:20

标签: nestjs

NestJS文档描述了如何定义多个数据库:

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

以及使用数据库配置服务进行异步配置:

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

是否可以通过异步配置服务定义多个数据库?

实验上,我尝试从服务中返回一系列选项:

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

但是这种方法没有运气。

1 个答案:

答案 0 :(得分:0)

对于每个要建立的连接,您似乎需要创建一个单独的配置实例。我可能建议使用某种工厂名称,或者使用数据库连接的配置键,然后使用工厂中的名称帮助返回期望值。因此,文档有一个类似

的工厂
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,否则它告诉您功能不兼容。如果愿意,还可以将大多数配置保存在config服务和环境变量中。