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.25
, Ubuntu 15.04 (GNU/Linux 3.19.0-42-generic x86_64)
和最新版本的graceful-fs
如果有帮助的话)!
感谢您的任何帮助,您可以提供。
这是我做过的最愚蠢的错误。 无论如何,这是答案。 我希望我能拯救一个人处理这个错误,几乎把他们的头发撕掉。
我正在运行与nodejs
而不是node
应用程序。 原来,如果你做了nodejs --version
,它可能会返回一个非常旧的版本,对我来说这个版本是v0.10.25
。 node --version
是v5.6.0
。 显然,这个版本的大规模跳跃将修复一些东西,所以我用node app.js
而不是nodejs app.js
运行了应用程序,而且我从来没有遇到这个问题。 现在只有6个打开的文件,而之前我们有超过1000个时间。
该死的感觉很好,把我的胸部脱下来。