nodejs应用程序中未处理的错误EMFILE
Posted
技术标签:
【中文标题】nodejs应用程序中未处理的错误EMFILE【英文标题】:Unhandled error EMFILE in nodejs application 【发布时间】:2014-06-28 19:40:24 【问题描述】:在谷歌上我发现这意味着打开了太多文件,但我已经检查过,除了这个服务器之外没有其他文件在运行。有人请帮助我。
events.js:72 投掷者; // 未处理的“错误”事件 ^ 错误:监听 EMFILE 在 errnoException (net.js:904:11) 在 Server._listen2 (net.js:1023:19) 在听 (net.js:1064:10) 在 Server.listen (net.js:1138:5) 在 Function.app.listen (/home/kkcorps/Desktop/check/node_modules/express/lib/application.js:529:24) 在对象。 (/home/kkcorps/Desktop/check/port_2.js:48:5) 在 Module._compile (module.js:456:26) 在 Object.Module._extensions..js (module.js:474:10) 在 Module.load (module.js:356:32) 在 Function.Module._load (module.js:312:12)
这是我的代码:
var express = require('express');
var path = require('path');
var app = express();
app.configure(function()
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.static('static'));
app.set('view engine', 'hbs');
app.set('views', path.join(__dirname, 'views'));
);
var net = require('net');
var port = 1;
var timeout = 2000;
var open_ports = [];
while(port < 10000)
(function(port)
var sckt = new net.Socket();
sckt.setTimeout(timeout, function()
sckt.destroy();
);
sckt.connect(port,function()
console.log('connected to localhost on port: '+ port);
open_ports.push(port);
//client.write('connected to localhost');
);
sckt.on('error',function(e)
sckt.destroy();
);
)(port);
port++;
//open_ports = ['1','2','3'];
app.get('/', function(req, res)
//res.send('Hello world');
res.render('index', cont: open_ports);
)
app.listen(3000);
console.log('server running on port 3000');
【问题讨论】:
【参考方案1】:"打开的文件太多" => "打开的文件描述符太多"。 Socket === 文件描述符,所以这并不奇怪。您可以尝试 2 件事:调整 ulimit -n
(在基于 Unix 的系统上)或/和限制并发:一次打开 10000 个套接字听起来是个坏主意。 async.parallelLimit
是一种方法。
【讨论】:
我不知道如何,但将我的本地主机 IP(即 127.0.0.1)添加到 socket.connect 程序开始正常运行。 奇怪,和localhost
一样吗?以上是关于nodejs应用程序中未处理的错误EMFILE的主要内容,如果未能解决你的问题,请参考以下文章
使用 Jest 进行测试失败并出现错误:查看文件以进行更改时出错:EMFILE