根本原因是windows跨盘符切换导致process.cwd()与__dirname不在同一驱动器,使相对路径解析失效;唯一可靠解法是用path.join(__dirname, 'config.json')构建绝对路径,锚定js文件物理位置。

为什么 fs.readFile('./config.json') 在 Windows 上突然报 ENOENT?
根本不是 Node.js 或 VSCode 的 bug,而是路径解析逻辑被盘符切换搞乱了:./ 始终基于 process.cwd(),而 Windows 终端在跨盘符切换时(比如从 C: 切到 D:),process.cwd() 会变成新盘符的根目录,但你的 JS 文件可能还在 C:project 下。此时 ./config.json 实际去找的是 D:config.json,当然找不到。
- 典型现象:在项目根目录(
C:myapp)下执行node index.js成功;但你先cd D: emp再运行node C:myappindex.js,就报ENOENT: no such file or directory, open './config.json' - 验证方法:在代码开头加
console.log('cwd:', process.cwd(), 'dirname:', __dirname),一眼看出两者是否跨盘符、是否指向同一驱动器 - 别依赖相对路径启动位置——哪怕你保证永远在项目根目录运行,CI/CD 或他人协作时也大概率失效
path.join(__dirname, ...) 是唯一靠谱的锚定方式
只要路径起点是 __dirname,就和当前 JS 文件物理位置强绑定,彻底绕过盘符漂移问题。Windows 和 Linux 路径分隔符差异由 path.join 自动处理,不用拼字符串、不担心反斜杠。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- ✅ 正确写法:
const configPath = path.join(__dirname, 'config.json'); - ✅ 读上层文件:
path.join(__dirname, '..', '.env')—— 即使__dirname是C:c,结果也是C:.env,不会跳到别的盘 - ❌ 错误写法:
__dirname + '\config.json'或__dirname + '/config.json':硬编码分隔符,Windows 上可能因双反斜杠或混用出错 - ⚠️ 注意:
path.resolve('./config.json')仍依赖process.cwd(),和./config.json本质一样,不能替代path.join(__dirname, ...)
VSCode 终端默认盘符经常“不按常理出牌”
右键文件夹 →「在终端中打开」,VSCode 有时会继承资源管理器最后停留的盘符,而不是你点击的那个文件夹所在盘。比如你在 D 盘浏览过,再点 C 盘的项目文件夹,终端可能还是以 D: 开头。
- 快速确认:
echo %cd%(CMD)或Get-Location(PowerShell)看当前路径盘符 - 强制切回项目盘符:
C:或D:单独敲一行,再cd path oproject - 一劳永逸:在
.vscode/settings.json里加"terminal.integrated.shellArgs.windows": ["-NoExit", "-Command", "Set-Location 'C:\myapp'"](替换为你的实际路径),但仅限固定项目 - 更推荐:直接在 launch.json 的
env里设"NODE_ENV": "development"等变量,而非靠路径猜环境
调试时 runtimeExecutable 指向错误盘符也会连锁报错
launch.json 里如果写死 "runtimeExecutable": "C:\Program Files\nodejs\node.exe",但某天你把 Node 重装到了 D 盘,或者用了 nvm-windows 切换版本,这个路径就失效了。VS Code 不会报“找不到 node”,而是静默 fallback 到 PATH 查找——如果 PATH 没配好,后续所有 fs 操作都可能因启动失败而间接报错。
- 检查方法:调试时看 Debug Console 输出的第一行,是否含
Starting inspector on...;没有就说明 Node 进程根本没起来 - 安全写法:删掉
runtimeExecutable,让 VS Code 自动从 PATH 读;或用${env:NODE_HOME}\node.exe(需确保NODE_HOME环境变量已设) - nvm-windows 用户注意:
nvm use 18.17.0后,必须重启 VS Code 终端,否则runtimeExecutable还指向旧版本路径 - 盘符级陷阱:
runtimeExecutable路径里的盘符和program路径盘符不一致(比如前者是D:,后者是C:),Node 进程启动后process.cwd()会默认落到runtimeExecutable所在盘符,加剧路径错乱
__dirname 出发,用 path.join 构建,其余任何相对路径写法,在 Windows 多盘符环境下都等同于埋雷。










