Node.js不closures由fs.createReadStream()创build的文件

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

这样做的工作,但它并没有closures文件的连接。 所以读取1024个文件(在我的服务器上的限制)后,Node.js会产生错误EMFILE, too many open files 。 然后我必须杀死我们的Node.js服务器,再次打开它,这将清除“打开的文件”。

我检查由lsof -i -n -P | grep nodejs打开的文件数量 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() ,但我仍然得到同样的问题。 我的服务器基本上是一个滴答作响的定时炸弹,因为我们得到了一个沉重的,稳定的用户stream量,并在这么多的用户连接后,它将停止工作。

另外, ulimit -n [open file amount]不起作用,即使这样做,这也不是一个长期的解决scheme,因为我希望我的文件连接closures,而不是无故打开。

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

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

这是我做过的最愚蠢的错误。 无论如何,这是答案。 我希望我能拯救一个人处理这个错误,几乎把他们的头发撕掉。

我正在运行与nodejs而不是node应用程序。 原来,如果你做了nodejs --version ,它可能会返回一个非常旧的版本,对我来说这个版本是v0.10.25node --versionv5.6.0 。 显然,这个版本的大规模跳跃将修复一些东西,所以我用node app.js而不是nodejs app.js运行了应用程序,而且我从来没有遇到这个问题。 现在只有6个打开的文件,而之前我们有超过1000个时间。

该死的感觉很好,把我的胸部脱下来。