You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
故障原因

读不到值是两个问题叠在一起导致的:

  1. 引入路径错误:require("./config")是相对当前文件所在路径找依赖,你在/server/src下写这个引入,找的是/server/src/config.js,根本没加载到你写在根目录的config文件,自然拿不到导出的变量。
  2. dotenv默认路径规则不符合预期:就算你把config文件移到server目录下,dotenv.config()默认读取的是Node服务启动时所在工作目录下的.env文件,服务从server目录启动时,默认找的是/server/.env,不会主动读根目录的.env配置。
修复步骤
  1. 推荐把config文件放到/server目录下维护(想放根目录也可以,把后续require路径改成对应相对路径即可,比如从/server/src引入根目录config要写require("../../config"))
  2. 修改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,
}
  1. 服务端代码里引入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:42:18