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

无法读取 Node JS 中未定义的属性“名称”

节点和错误:EMFILE,打开的文件太多

EMFile:打开的文件太多,观看 - 构建 Release 反应原生 iOS 应用程序

Node.js 中的“连接 EMFILE”错误

反应本机中未处理的承诺拒绝错误?