fs.readFile('./a.txt') 是相对“启动目"> fs.readFile('./a.txt') 是相对“启动目"> fs.readFile('./a.txt') 是相对“启动目">
Node.js 词条目录
前端Wiki/Node.js/进阶/路径 path

path 与 __dirname

相对路径在 Node 里是个坑:fs.readFile('./a.txt') 是相对“启动目录”(cwd),在哪个目录执行 node 命令就 relative 到哪里,部署时常因此找不到文件。

解药是 __dirname —— 它代表“当前 js 文件所在目录的绝对路径”,无论从哪里启动都不会变。所有文件操作都建议 path.join(__dirname, ...) 拼路径。

  • ./ 相对 cwd(你敲 node 命令的目录),换目录就失效
  • __dirname / __filename 相对当前源码文件,部署后依然稳定
  • 路径拼接一律用 path.join,它自动处理斜杠与多余分隔符
JS
const fs = require('fs');
const path = require('path');

// ❌ 相对 cwd:换到别的目录启动就报 ENOENT
// fs.readFileSync('./data/users.json');

// ✅ 相对当前文件,与启动位置无关
const dataFile = path.join(__dirname, 'data', 'users.json');
console.log('数据文件:', dataFile);
// Windows 下自动得到反斜杠:C:\proj\data\users.json

// 命令行启动目录(cwd)也不是没用:适合接收用户传入的路径
console.log('cwd =', process.cwd());

// __filename:当前文件的绝对路径
console.log('本文件 =', __filename);
本节要点文件路径一律 path.join(__dirname, ...):__dirname 相对源码文件,稳如泰山;./ 相对 cwd,随启动目录漂移。