如何正确使用 Node.js 的 fs.existsSync 判断目录是否存在

`fs.existssync()` 是同步文件存在性检查方法,直接返回布尔值,无需 try-catch 包裹;错误使用异常捕获会导致逻辑失效,始终返回 `true`。

在 Node.js 中,fs.existsSync(path) 是一个纯函数式同步 API:它不抛出异常,仅根据路径是否存在返回 true 或 false。这是其设计本质——与 fs.statSync() 等可能抛错的 API 不同,existSync 永远不会触发 catch 分支。因此,原代码中包裹 try/catch 不仅多余,更导致严重逻辑错误:

checkFolder: function(folder) {
  try {
    fs.existsSync(folder); // ✅ 执行成功,但返回值被丢弃!
    return true;          // ❌ 无论路径是否存在,这里都执行并返回 true
  } catch (e) {
    console.log('Folder does not exists');
    return false;
  }
}

由于 fs.existsSync() 在路径不存在时也静默返回 false(而非抛错),catch 永远不会进入,return true 成为唯一出口——这就解释了为何“假目录 fdfdfd 也被判定为存在”。

✅ 正确写法极其简洁:

const fs = require('fs');
const path = require('path');

// ✅ 推荐:直接返回 fs.existsSync 结果
checkFolder: function(folder) {
  return fs.existsSync(folder);
}

// ✅ 进阶:若需区分文件/目录,可结合 fs.statSync(注意异常处理)
checkDirectory: function(folder) {
  try {
    const stat = fs.statSync(folder);
    return stat.isDirectory(); // 确保是目录,而非同名文件
  } catch (e) {
    return false; // 路径不存在,或非目录(如是文件),均视为“目录不存在”
  }
}

⚠️ 注意事项:

  • fs.existsSync() 自 Node.js v10.0.0 起已不推荐用于新项目(官方标记为 DEPRECATED),因其存在竞态条件风险(检查后立即被删除/创建)。生产环境建议改用 fs.promises.access()(Promise 版)或 fs.accessSync()(同步版)配合 fs.constants.F_OK。
  • 若需严格判断“是否为目录”(而非普通文件),请勿仅依赖 existsSync,务必用 fs.statSync().isDirectory() 或 fs.lstatSync().isDirectory()(后者不解析符号链接)。
  • 环境变量(如 process.env.aemRepo)为空或含非法字符时,path.join() 可能生成意外路径,建议在调用前校验关键环境变量。

总结:删掉无意义的 try/catch,直取 fs.existsSync() 返回值——简单、正确、符合 Node.js 官方语义。