Node.js应用如何跨目录读取根目录.env中的环境变量
问题复现
目录结构
项目根目录/ ├── .env # 全局环境变量配置文件 ├── client/ # 前端项目目录 └── server/ # 服务端项目目录 └── src/ # 服务端业务代码路径
异常代码
根目录下的配置代码:
// 根目录/config.js const dotenv = require("dotenv"); dotenv.config(); module.exports = { NODE_ENV: process.env.NODE_ENV, }
服务端目录下的调用代码:
// /server/src/index.js const { NODE_ENV } = require("./config"); console.log(NODE_ENV); // 输出undefined
故障原因
读不到值是两个问题叠在一起导致的:
- 引入路径错误:
require("./config")是相对当前文件所在路径找依赖,你在/server/src下写这个引入,找的是/server/src/config.js,根本没加载到你写在根目录的config文件,自然拿不到导出的变量。 - dotenv默认路径规则不符合预期:就算你把config文件移到server目录下,
dotenv.config()默认读取的是Node服务启动时所在工作目录下的.env文件,服务从server目录启动时,默认找的是/server/.env,不会主动读根目录的.env配置。
修复步骤
- 推荐把config文件放到
/server目录下维护(想放根目录也可以,把后续require路径改成对应相对路径即可,比如从/server/src引入根目录config要写require("../../config")) - 修改config里的dotenv初始化逻辑,显式指定根目录.env的绝对路径,不受启动目录影响:
// /server/config.js const dotenv = require("dotenv"); const path = require("path"); // 显式指定.env文件位置:从当前config.js所在的server目录,往上走一层就是根目录 dotenv.config({ path: path.resolve(__dirname, "../.env") }); module.exports = { NODE_ENV: process.env.NODE_ENV, }
- 服务端代码里引入config的时候写对相对路径,比如在
/server/src/index.js里引入,就写:
const { NODE_ENV } = require("../config");
其他可选方案
如果不想改config代码,也可以直接在启动服务的命令里指定dotenv加载的.env路径,不需要在代码里手动初始化dotenv:
# 在server目录下执行启动命令,指定上一级根目录的.env node -r dotenv/config src/index.js dotenv_config_path=../.env
用nodemon、pm2等工具启动时,把上面的路径参数加到启动脚本里即可。
踩坑提醒
- 先确认根目录的.env文件里真的写了
NODE_ENV=xxx,别变量名拼错了白忙活 - .env记得加到.gitignore里,别把密钥之类的敏感配置提交到代码仓库
- 要是改完还是读不到,直接打印
path.resolve(__dirname, "../.env")看拼出来的完整路径对不对,目录层级不对就调整../的数量即可
内容的提问来源于stack exchange,提问作者none
相关产品推荐
相关产品推荐

