Node.js没有关闭fs.createReadStream()创建的文件

Edw*_*nch 6 javascript fs node.js

在我的服务器上,每次用户使用我们的服务时,我们都必须从服务器获取它们的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();
    });
}
Run Code Online (Sandbox Code Playgroud)

这样做,但它不会关闭与文件的连接.因此,在读取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)
Run Code Online (Sandbox Code Playgroud)

对于任何打开的文件.

我尝试过使用graceful-fs.我试着打电话stream.destroy()stream.close(),但我仍然得到同样的问题.我的服务器本质上是一个滴答作响的定时炸弹,因为我们得到了一个沉重,稳定的用户流,并且在这么多用户连接后它将停止工作.

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

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

感谢您的任何帮助,您可以提供.

Edw*_*nch 4

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

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

该死,把这件事从心里说出来感觉真好。