节点.js不关闭由 fs.createReadStream() 创建的文件
Node.js not closing files created by fs.createReadStream()
在我的服务器上,每次用户使用我们的服务时,我们都必须从服务器中获取一个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
如果有帮助的话!
感谢您提供的任何帮助。
这一定是我犯过的最愚蠢的错误。无论如何,这是答案。我希望我能拯救某人免于处理此错误并几乎扯掉他们的头发。
我用nodejs
而不是node
运行我的应用程序。事实证明,如果你做nodejs --version
,它可能会返回一个非常旧的版本,这对我来说v0.10.25
。 然而node --version
v5.6.0
.显然,这种版本的大规模跳跃会修复一些问题,所以我用node app.js
而不是nodejs app.js
运行该应用程序,从那以后我根本没有遇到过这个问题。现在只有 6 个打开的文件,而以前随着时间的推移,我们有 1000 多个。
该死的,把这个从我的胸前拿下来感觉很好。
- 在节点中创建文件全局变量
- JSX未创建文件
- 用javascript创建文件夹
- 为什么获胜'不要狼吞虎咽地创建文件
- 创建文件上载进度栏ASP.NET和JavaScript
- 创建文件下载js
- Native Phonegap、下载并创建文件、动态命名文件和返回路径
- 应用程序脚本高级驱动器API服务-newFile()方法未创建文件
- HTML5文件系统:未在设备上创建文件
- 如何创建文件夹,此文件夹中的文件,压缩文件夹(在zip或rar文件中)并使用Javascript将其上传到桌面
- 使用可用的 Bytestream 在 Javascript 中创建文件
- 使用 javascript 从查询创建文件
- 动态创建文件输入时,jQuery 文件上传不起作用
- 如果文件不存在,请创建文件,然后将日志写入其中
- 动态创建文件输入元素
- php 在目录中创建文件
- 剑道UI网格导出Excel和pdf导出,未创建文件
- 使用 Google Drive API v3 (javascript) 创建文件
- 在Google Apps Script上为上传的文件创建文件夹
- 如何使用Javascript在磁盘上创建文件夹,如时间戳