NestJS/Mikro-ORM执行迁移时无法读取.env环境变量问题
问题根因
两个核心问题导致配置始终无法读取到预期的环境变量:
- 环境变量键名拼写不匹配:你贴出的
process.env打印结果中,数据库用户名对应的键是DB_USER,但配置代码里读取的是process.env.DB_USERNAME,键名不一致导致始终读取到undefined,因此触发默认兜底参数;当你去掉兜底值后,MySQL驱动会默认使用当前系统用户名(即报错中出现的root)发起连接,和你观察到的现象完全吻合。 - 错误在MikroORM独立配置文件中依赖NestJS模块逻辑:
mikro-orm.config.ts是供MikroORM CLI工具直接读取加载的配置文件,CLI运行时不会启动NestJS应用、不会初始化Nest的IoC容器,你写的ConfigModule.forRoot()仅完成了模块定义注册,根本不会执行.env文件的加载逻辑,手动实例化的ConfigService自然也无法读取到预期配置。
修复方案
按以下步骤调整即可解决问题:
- 统一环境变量键名,二选一即可:
- 修改
.env文件,将DB_USER改名为DB_USERNAME,和配置代码中的读取键对齐 - 或者修改配置代码,将所有读取
DB_USERNAME的位置改为读取DB_USER,和.env中的定义对齐
- 修改
- 移除
mikro-orm.config.ts中和NestJS ConfigModule相关的代码,这类依赖Nest运行时的逻辑无法在MikroORM CLI加载配置时生效,你最开始写的直接用dotenv加载.env文件的逻辑本身是可用的,修正键名后即可正常工作。 - (可选,规避CLI路径问题)在项目根目录
package.json中增加MikroORM配置,指定使用ts-node加载TS格式的配置文件,避免运行命令时工作目录不一致导致的.env路径错误:
{ "mikro-orm": { "useTsNode": true, "configPaths": [ "./src/mikro-orm.config.ts", "./dist/mikro-orm.config.js" ] } }
修复完成后可以在配置文件中临时增加打印逻辑,确认读取到的用户名、密码等参数和.env中定义的一致,再执行迁移命令即可正常运行。
内容的提问来源于stack exchange,提问作者Steven Scott
相关产品推荐
相关产品推荐

