node --env-file=.env app.js node -e "console.log(process.env.DB_HOST ? 'ok' : 'missing')"
数据库模块在顶层读 process.env.DB_HOST,启动后连的却是 127.0.0.1。dotenv.config() 写在 config 文件第 12 行,前面几行 import 已经执行完了。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,ESM 的 import 会被提升到模块顶部,先于同文件里的任何语句执行,dotenv 还没读进 .env,依赖它的模块已经把值取走了。CommonJS 按书写顺序执行,入口里的顺序错一次也是同样结果。
「dotenv 加载顺序」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
处理上按这个顺序:把 dotenv 配置拆成单独文件 在入口第一行 import;或者用 node --env-file=.env 让运行时先加载;确认 .env 用的是绝对路径 不依赖 cwd;启动时打印一次关键变量是否为空 不要打印值。
改完只确认一件事:启动日志里 DB_HOST 显示 ok 连接目标是配置里的地址 不再是 127.0.0.1。
