NestJS文档描述了如何定义多个数据库:
https://docs.nestjs.com/techniques/database#multiple-databases
以及使用数据库配置服务进行异步配置:
https://docs.nestjs.com/techniques/database#async-configuration
是否可以通过异步配置服务定义多个数据库?
实验上,我尝试从服务中返回一系列选项:
class TypeOrmConfigService implements TypeOrmOptionsFactory {
createTypeOrmOptions() {
return [
{ ... },
{ ... }
];
}
}
但是这种方法没有运气。
答案 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服务和环境变量中。