【发布时间】: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.25、Ubuntu 15.04 (GNU/Linux 3.19.0-42-generic x86_64) 和最新版本的 graceful-fs!
感谢您提供的任何帮助。
【问题讨论】:
-
我是否可以建议您使用
fs.readFile(),它会自动为您附加整个字符串并正确处理所有错误情况?当你问这个问题时,也许这不是一个选项,但它会在这里为你节省很多行;-)。
标签: javascript node.js fs