Похоже, что для каждого соединения, которое вы хотите иметь, вам нужно будет создать отдельный экземпляр конфигурации.Я мог бы предложить какую-то фабрику, которая берет имя, и, возможно, ключ конфигурации для соединения с базой данных, а затем использовать фабрику, чтобы помочь вернуть ожидаемые значения.Таким образом, у документов есть фабрика, подобная
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
, в противном случае он сообщает, что функции несовместимы.Вы также можете сохранить большинство конфигов в сервисе конфигурации и переменных среды, если хотите.