
`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 官方语义。










