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

为何在根目录外访问环境变量会返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:10:28