节点js ENOENT文件错误处理

时间:2018-01-12 22:33:54

标签: node.js file enoent

我有一个简单的过程,需要打开一个文件来读取,但如果文件不存在,它应该只是注意/忽略错误并继续。

我已经尝试了很多来源,但是找不到明确的例子,说明如何成功检查文件是否存在而没有节点进程抛出一个unaughtexception 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);
})

3 个答案:

答案 0 :(得分:0)

由于竞争条件,您不应在开放前检查是否存在文件,请参阅以下摘录自fs.exists()文档。

  

在调用fs.open()之前,使用fs.exists()检查文件是否存在,建议不要使用fs.readFile()或fs.writeFile()。这样做会引入竞争条件,因为其他进程可能会更改两个调用之间的文件状态。相反,用户代码应直接打开/读取/写入文件,并在文件不存在时处理引发的错误。

     

Node.js fs.exists()文档:Source

如上所述,您应该只处理传递给fs.open()回调函数的错误。 fs.open()通过err参数向您的回调返回错误,代码为ENOENT,但不会导致UncaughtException随后崩溃您的流程(假设您不是&# 39;在处理对象process.on('UncaughtException', err => {}))上处理此问题。

您可能会在代码中使用错误或使用" throw"而不是"返回"描述如何将错误传递回代码时。除非UncaughtException,否则上述示例代码不会导致err.code !== 'ENOENT'。如果err.code !== 'ENOENT'导致err在没有包装try/catch阻止的情况下被抛出,那么由于UncaughtException

会导致您的流程崩溃

答案 1 :(得分:0)

我也为fs.exist和fs.existSync获得ENOENT,这没有任何意义。奇怪的是,这是由一个未使用的变量引起的(见下文),一旦我删除了这个变量,ENOENT就会消失,不知道为什么。

var params =     var params = {
    input: fs.createReadStream(msgfile),
    output: process.stdout,
    terminal: false
}

答案 2 :(得分:-2)

在尝试打开之前尝试使用fs.existsSync()

https://nodejs.org/api/fs.html#fs_fs_existssync_path