我得到以下警告:

(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace: 
    at EventEmitter.<anonymous> (events.js:139:15)
    at EventEmitter.<anonymous> (node.js:385:29)
    at Server.<anonymous> (server.js:20:17)
    at Server.emit (events.js:70:17)
    at HTTPParser.onIncoming (http.js:1514:12)
    at HTTPParser.onHeadersComplete (http.js:102:31)
    at Socket.ondata (http.js:1410:22)
    at TCP.onread (net.js:354:27)

我在server.js中写了这样的代码:

http.createServer(
    function (req, res) { ... }).listen(3013);

如何解决这个问题?


当前回答

You said you are using process.on('uncaughtException', callback); Where are you executing this statement? Is it within the callback passed to http.createServer?If yes, different copy of the same callback will get attached to the uncaughtException event upon each new request, because the function (req, res) { ... } gets executed everytime a new request comes in and so will the statement process.on('uncaughtException', callback);Note that the process object is global to all your requests and adding listeners to its event everytime a new request comes in will not make any sense. You might not want such kind of behaviour. In case you want to attach a new listener for each new request, you should remove all previous listeners attached to the event as they no longer would be required using: process.removeAllListeners('uncaughtException');

其他回答

缺省情况下,任何单个事件最多可以注册10个侦听器。

如果这是你的代码,你可以通过:

const emitter = new EventEmitter()
emitter.setMaxListeners(100)
// or 0 to turn off the limit
emitter.setMaxListeners(0)

但如果这不是你的代码,你可以使用技巧来增加全局默认限制:

require('events').EventEmitter.prototype._maxListeners = 100;

当然,你可以关闭限制,但要小心:

// turn off limits by default (BE CAREFUL)
require('events').EventEmitter.prototype._maxListeners = 0;

顺便说一句。代码应该在应用程序的最开始。

ADD:从节点0.11开始,这段代码也可以改变默认限制:

require('events').EventEmitter.defaultMaxListeners = 0

我们团队对此的解决方案是从.npmrc中删除注册表路径。rc文件中有两个路径别名,其中一个指向已弃用的Artifactory实例。

这个错误与我们的应用程序的实际代码无关,而是与我们的开发环境有关。

在创建新的侦听器之前,您需要使用以下命令清除所有侦听器:

客户端/服务器

socket.removeAllListeners(); 

假设socket是您的客户端套接字/或创建的服务器套接字。

你也可以订阅特定的事件监听器,比如像这样删除连接监听器:

this.socket.removeAllListeners("connect");

把它放在你的server.js(或任何包含你的主Node.js应用程序)的第一行:

需要.EventEmitter.prototype(“事件”)。_maxListeners = 0;

错误就消失了:)

我也面临着同样的问题,但我已经成功地处理了异步等待。 请检查是否有帮助。 let dataLength = 25; 之前: for(设I = 0;i < dataLength;我+ +){ sftp。get (remotePath fs.createWriteStream (xyzProject / ${数据[我]. name})); } 后: for(设I = 0;i < dataLength;我+ +){ 等待sftp。get (remotePath fs.createWriteStream (xyzProject / ${数据[我]. name})); }