JavaScript ES6 import语法下dotenv配置失效,如何正确配置?
解决ES6模块下dotenv无法读取环境变量的问题
核心问题:路径解析逻辑变化
ES模块中没有CommonJS的__dirname/__filename变量,而dotenv的config({ path })参数默认基于**当前工作目录(process.cwd())**解析,而非模块文件所在目录——这正是切换语法后失效的关键原因,之前require的相对路径逻辑不再适用。
解决方案:使用绝对路径指定env文件
通过import.meta.url获取当前模块的绝对路径,拼接env文件路径,彻底避免工作目录变化带来的路径问题。
场景1:config.env放在server/db目录下(你的目标结构)
修改server/db/conn.js代码:
import * as dotenv from 'dotenv'; import path from 'path'; import { fileURLToPath } from 'url'; // 模拟CommonJS的__dirname/__filename const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // 拼接config.env的绝对路径(与conn.js同目录) dotenv.config({ path: path.join(__dirname, 'config.env') }); // 测试是否读取成功 console.log(process.env.MONGODB_URI); // 替换为你的环境变量名
场景2:config.env放在server根目录下
只需调整路径拼接部分:
dotenv.config({ path: path.join(__dirname, '../config.env') });
额外检查项
- 确认
package.json中已添加"type": "module",这是启用ES模块的必要配置:{ "type": "module" } - 检查环境变量名拼写是否正确(比如报错中
uri对应的变量是否确实存在于config.env中) - 更新dotenv到最新版本,避免旧版本的ES模块兼容问题:
npm install dotenv@latest - 确保运行脚本时,没有通过
NODE_ENV等变量覆盖dotenv的加载逻辑
内容的提问来源于stack exchange,提问作者naossoan
相关产品推荐
相关产品推荐

