Node js ENOENT 文件错误处理
Posted
技术标签:
【中文标题】Node js ENOENT 文件错误处理【英文标题】:Node js ENOENT file error handling 【发布时间】:2018-06-22 10:17:38 【问题描述】:我有一个简单的过程,需要打开一个文件来读取,但如果文件不存在,它应该简单地记录/忽略错误并继续。
我尝试了许多来源,但找不到明确的示例,说明如何在节点进程不抛出未捕获异常 ENOENT 的情况下成功检查文件是否存在。
一个简单的例子是:
fs.open('a.txt', 'r', function(err, fd)
if(err)
if(err.code === 'ENOENT' )
console.log("Does not exist");
return;
throw err;
console.log(err.code);
)
【问题讨论】:
【参考方案1】:由于竞争条件,您不应在打开文件之前检查文件是否存在,请参阅fs.exists()
文档的以下摘录。
不建议在调用 fs.open()、fs.readFile() 或 fs.writeFile() 之前使用 fs.exists() 检查文件是否存在。这样做会引入竞争条件,因为其他进程可能会在两次调用之间更改文件的状态。相反,用户代码应该直接打开/读取/写入文件并处理文件不存在时引发的错误。
Node.js
fs.exists()
文档:Source
如上所述,您应该只处理传递给fs.open()
回调函数的错误。 fs.open()
通过 err
参数返回一个错误到您的回调,代码为 ENOENT
不会导致 UncaughtException
随后使您的进程崩溃(假设您没有在进程对象上处理此问题,@987654329 @)。
在描述如何将错误传递回代码时,您可能在代码中抛出错误或使用“抛出”而不是“返回”一词。上面的示例代码不会导致UncaughtException
,除非err.code !== 'ENOENT'
。如果err.code !== 'ENOENT'
则导致err
在没有包装try/catch
块的情况下被抛出,这将导致您的进程由于UncaughtException
而崩溃
【讨论】:
【参考方案2】:我也得到了 fs.exist 和 fs.existSync 的 ENOENT,这没有任何意义。奇怪的是,这是由一个未使用的变量(见下文)引起的,一旦我删除了这个 var,ENOENT 就消失了,不知道为什么。
var params = var params =
input: fs.createReadStream(msgfile),
output: process.stdout,
terminal: false
【讨论】:
除了剪切和粘贴问题和不查看帖子之外,我看到 ENOENT 来自哪里,不知道我是怎么错过的。【参考方案3】:在尝试打开之前尝试使用fs.existsSync()
。
https://nodejs.org/api/fs.html#fs_fs_existssync_path
【讨论】:
不建议这样做,因为可能会发生竞争情况以上是关于Node js ENOENT 文件错误处理的主要内容,如果未能解决你的问题,请参考以下文章
node.js - 错误:ENOENT:没有这样的文件或目录,取消链接
Node.js 错误 ENOENT,未更改任何内容时打开“文件/路径”
使用 Node 8.9.4 LTS 安装 Sails.js 依赖项时,NPM“ENOENT:没有此类文件或目录错误”