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 fs.rename() 错误 enoent

Node.js 错误 ENOENT,未更改任何内容时打开“文件/路径”

使用 Node 8.9.4 LTS 安装 Sails.js 依赖项时,NPM“ENOENT:没有此类文件或目录错误”

错误:ENOENT:没有这样的文件或目录,uv_resident_set_memory

产生 ENOENT node.js 错误