为何在根目录外访问环境变量会返回undefined?
解决非根目录文件无法读取.env变量的问题
问题原因
你在根目录的app.js里加载了dotenv,但非根目录的file1.js要么没加载dotenv,要么加载时没指定正确的.env路径;如果直接单独运行file1.js,环境变量根本没被注入到进程中。
解决方案
方案1:在file1.js中指定.env路径加载
在file1.js里手动加载dotenv,并通过路径解析指向根目录的.env文件:
import dotenv from 'dotenv'; import { fileURLToPath } from 'url'; import { dirname, resolve } from 'path'; // ES模块中需要手动获取__dirname const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); // 指向根目录的.env文件 dotenv.config({ path: resolve(__dirname, '../.env') }); console.log(process.env.PASSWORD); // 现在可以正常获取值
如果你的项目用的是CommonJS(require语法),可以简化:
const dotenv = require('dotenv'); const path = require('path'); dotenv.config({ path: path.resolve(__dirname, '../.env') }); console.log(process.env.PASSWORD);
方案2:通过根目录入口文件共享环境变量
确保file1.js是被app.js引入执行,而不是单独运行。因为app.js已经加载了dotenv,进程级的环境变量会被所有模块共享:
修改app.js,导入file1.js:
import dotenv from 'dotenv'; dotenv.config(); // 导入file1.js,此时它能访问已加载的环境变量 import './folder1/file1.js'; console.log(process.env.PASSWORD);
然后运行node app.js,file1.js里的console.log就能输出正确的环境变量值。
方案3:启动时全局加载.env
在package.json的启动脚本中,用dotenv/config预加载环境变量,这样所有模块都能直接访问:
{ "scripts": { "start": "node -r dotenv/config app.js" } }
如果.env不在当前执行目录,也可以指定路径:
{ "scripts": { "start": "node -r dotenv/config app.js dotenv_config_path=./.env" } }
之后运行npm start,所有模块都能直接读取process.env里的变量。
内容的提问来源于stack exchange,提问作者Anshu
相关产品推荐
相关产品推荐

