如何在NestJS中配置TypeORM模块?不依赖process.env且参数提前未知
动态配置NestJS的TypeOrmModule问题
硬编码配置示例
通过装饰器配置TypeOrmModule的典型写法如下:
import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; @Module({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', host: 'localhost', port: 3306, username: 'root', password: 'root', database: 'test', entities: [], autoLoadEntities: true, // 仅在本地开发环境启用 synchronize: true, }), ], }) export class AppModule {}
核心问题
上述配置所有参数均为硬编码。但实际场景中,我们可能无法提前确定host、port、依赖环境名称的autoLoadEntities标志等参数——这里的“提前”指的是装饰器内的静态字段和值被解析的时机,而所有配置获取逻辑必须在await NestFactory.create()执行前完成。
以下是应用启动逻辑示例,配置在启动前已完成解析:
import { NestFactory } from "@nestjs/core"; import type { NestExpressApplication } from "@nestjs/platform-express"; import Path from "path"; import { Logger } from "@yamato-daiwa/es-extensions"; import { ConsoleCommandsParser } from "@yamato-daiwa/es-extensions-nodejs"; (async function runApplication(): Promise<void> { const configurationFromConsoleCommand: ConsoleCommandsParser.ParsedCommand<ConsoleLineInterface.ParsedArguments> = ConsoleCommandsParser.parse(process.argv, ConsoleLineInterface.specification); const normalizedConfiguration: NormalizedConfiguration = ConfigurationNormalizer.normalize({ configurationFromConsoleCommand }); ConfigurationRepresentative.initialize(normalizedConfiguration); // 配置准备完成 const nestJS_Application: NestExpressApplication = await NestFactory.create<NestExpressApplication>(NestJS_ApplicationRootModule); await nestJS_Application.listen(normalizedConfiguration.HTTP_Port); })(). catch((error: unknown): void => { Logger.logError({ errorType: "ServerStartingFailedError", title: "Server starting failed", description: "The error occurred during starting of server", occurrenceLocation: "runApplication()", caughtError: error }); });
现有方案的局限
使用环境变量(process.env.XXX)是一种常见思路,但这不符合“参数提前未知”的前提,因此不能作为唯一解决方案。
内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD
相关产品推荐
相关产品推荐

