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

Node.js ES模块中dotenv指定自定义.env路径失效问题求助

Node.js ES模块下dotenv指定config目录.env文件无效的问题

我在Node.js中使用ES模块,原本根目录下的.env文件配合dotenv.config()能正常加载。但把.env移到config文件夹后,即使在dotenv.config()里指定路径,依然无法读取到文件内容,导致后续代码因环境变量缺失报错。

当前代码:

import { config } from "dotenv";

config({path: './config/.env'})

控制台报错:

Error: Expected token to be set for this request, but none was present
at RequestManager.resolveRequest (file:///C:/Users/macfi/OneDrive/Documents/GitHub/new_discord_bot/node_modules/@discordjs/rest/dist/index.mjs:734:15)
at RequestManager.queueRequest (file:///C:/Users/macfi/OneDrive/Documents/GitHub/new_discord_bot/node_modules/@discordjs/rest/dist/index.mjs:706:46)
at REST.raw (file:///C:/Users/macfi/OneDrive/Documents/GitHub/new_discord_bot/node_modules/@discordjs/rest/dist/index.mjs:861:32)
at REST.request (file:///C:/Users/macfi/OneDrive/Documents/GitHub/new_discord_bot/node_modules/@discordjs/rest/dist/index.mjs:857:33)
at REST.put (file:///C:/Users/macfi/OneDrive/Documents/GitHub/new_discord_bot/node_modules/@discordjs/rest/dist/index.mjs:851:17)
at main (file:///C:/Users/macfi/OneDrive/Documents/GitHub/new_discord_bot/src/index.js:101:16)
at file:///C:/Users/macfi/OneDrive/Documents/GitHub/new_discord_bot/src/index.js:110:1
at ModuleJob.run (node:internal/modules/esm/module_job:198:25)
at async Promise.all (index 0)
at async ESMLoader.import (node:internal/modules/esm/loader:385:24)

试过用path模块和__dirname,但ES模块下__dirname不可用;dotenv文档只给了CommonJS的自定义路径示例,网上没找到有效方案,求解决思路。


解决思路

1. 用import.meta.url生成绝对路径

ES模块虽然没有__dirname,但可以通过import.meta.url获取当前模块的URL,结合path模块转换为绝对路径,彻底避免相对路径的歧义:

import { config } from "dotenv";
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';

// 模拟ES模块下的__dirname
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

// 根据你的文件层级拼接绝对路径,比如src目录下的脚本,要上一级到根目录再找config/.env
config({ path: join(__dirname, '../config/.env') });

join方法会自动适配Windows和Linux的路径分隔符,确保路径在不同系统都生效。

2. 检查当前工作目录

相对路径./config/.env是相对于启动Node时的工作目录,不是脚本所在目录。可以先打印process.cwd()确认当前工作目录是否为项目根目录:

console.log('当前工作目录:', process.cwd());

如果启动目录不对,要么切换到项目根目录再启动脚本,要么改用绝对路径加载.env。

3. 验证dotenv加载状态

在调用config后检查返回值,明确是文件找不到还是加载后变量异常:

const loadResult = config({ path: './config/.env' });
if (loadResult.error) {
  console.error('dotenv加载失败:', loadResult.error); // 直接看到具体错误,比如文件不存在
} else {
  console.log('加载的环境变量:', loadResult.parsed); // 确认变量是否正确读取
}

内容的提问来源于stack exchange,提问作者angelplusultra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:15:33