如何处理nodejs EMFILEexception而不修改ulimit?

我是Node.JS的新手,并且遇到EMFILE错误。 我追捕EMFILEexception,并在代码中处理它。

似乎有很多关于“错误:EMFILE,太多打开的文件”错误的问题,但大多数答案似乎是“增加你的ulimit”的行。

我的第一个问题是,我如何捕获这个exception? 当我用多个连接运行下面的代码时,会引发EMFILE错误:

stream = net.createConnection(port, host); stream.addListener('connect', function() { return stream.write(request); }); stream.addListener('data', function(data) { return console.log(data); }); stream.addListener('end', function() { stream.end(); return callback(); }); stream.addListener('timeout', function() { stream.destroy(); console.log("timeout"); return callback(); }); stream.addListener('error', function(e) { console.log("this never gets called"); return }); 

“错误”侦听器中没有捕获exception。 我已经尝试用try{} catch (e) {}来包装上述内容,但没有任何反应。 我已经使用createConnection的callback方法,它不会返回任何错误。

我能够发现exception的唯一方法是:

 process.on('uncaughtException', function(err) { console.log(err); }); 

这似乎是不安全的,因为它抓住了一切。

所以我的第二个问题是:什么是“最佳实践”方式来捕捉错误并重试呼叫?

我已经看过: https : //github.com/isaacs/npm/blob/master/lib/utils/graceful-fs.js和简单nodejs http代理失败与“太多打开文件”作为参考,但我' m不知道如何将npm的优雅方法应用到createConnection调用。

非常感谢!

即使你能发现这个例外,你会做什么有用的吗? 如果你有泄漏的地方,你需要修复泄漏,如果你有正常但负载很高,那么你需要以某种方式处理。 无论哪种方式,当你遇到这种情况,你的节点过程中的事情是非常糟糕的。

不幸的是,当你处理一个uncaughtException事件时,唯一安全的事情就是logging一条错误消息,然后退出进程。 抛出exception的堆栈现在已经不存在了,深层的内部混淆很快就会产生。

最好的解决scheme是增加进程可用的文件描述符的数量。 好消息是文件描述符真的很便宜。