【问题标题】:Node.js not closing files created by fs.createReadStream()Node.js 不关闭由 fs.createReadStream() 创建的文件
【发布时间】:2016-05-14 05:45:36
【问题描述】:

在我的服务器上,每次用户使用我们的服务时,我们都必须从服务器上为他们获取一个 JSON 文件。我通过在我自己的函数中使用fs.createReadStream() 来做到这一点。

function getJSONFromServer(filepath, callback){
    var data = fs.createReadStream(filepath);
    data.on('error', function (error) {
        console.log("Caught", error);
        callback(undefined, error);
    });
    var jsonFile = "";
    data.on('data', function(chunk) {
        jsonFile += chunk;
    });
    data.on('end', function() {
        var jsonData = JSON.parse(jsonFile);
        callback(jsonData);
        data.destroy();
        data.close();
    });
}

这可以完成这项工作,但不会关闭与文件的连接。因此,在读取 1024 个文件(我的服务器上的限制)之后,Node.js 将产生错误EMFILE, too many open files。然后我必须杀死我们的 Node.js 服务器,再次打开它,这将清除“打开的文件”。

我检查lsof -i -n -P | grep nodejs 打开的文件数量。它显示如下内容:

nodejs  13707     node   10u  IPv4 1163695      0t0  TCP 127.0.0.1:55643->127.0.0.1:27017 (ESTABLISHED)
nodejs  13707     node   11u  IPv4 1163697      0t0  TCP 127.0.0.1:55644->127.0.0.1:27017 (ESTABLISHED)

对于尽可能多的打开文件。

我尝试过使用优雅的 fs。我试过打电话给stream.destroy()stream.close(),但我仍然遇到同样的问题。我的服务器本质上是一个定时炸弹,因为我们有大量稳定的用户流量,在这么多用户连接后,它就会停止工作。

另外,ulimit -n [open file amount] 不起作用,即使它起作用,这也不是一个长期的解决方案,因为我希望我的文件连接关闭而不是无缘无故地打开。

如果有帮助,我正在使用 Node.js 版本 v0.10.25Ubuntu 15.04 (GNU/Linux 3.19.0-42-generic x86_64) 和最新版本的 graceful-fs

感谢您提供的任何帮助。

【问题讨论】:

  • 我是否可以建议您使用fs.readFile(),它会自动为您附加整个字符串并正确处理所有错误情况?当你问这个问题时,也许这不是一个选项,但它会在这里为你节省很多行;-)。

标签: javascript node.js fs


【解决方案1】:

这一定是我犯过的最愚蠢的错误。无论如何,这就是答案。我希望我可以让某人免于处理这个错误并差点扯掉他们的头发。

我使用nodejs 而不是node 运行我的应用程序。事实证明,如果你使用nodejs --version,它可能会返回一个非常旧的版本,对我来说是v0.10.25node --version 然而是v5.6.0。显然,版本的这种大规模跳跃可以解决一些问题,所以我使用node app.js 而不是nodejs app.js 运行应用程序,从那以后我就再也没有遇到过这个问题。现在只有 6 个打开的文件,而之前我们有超过 1000 个。

该死的感觉真好。

【讨论】:

    猜你喜欢
    • 2017-10-20
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    相关资源
    最近更新 更多