我得到以下警告:

(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);

如何解决这个问题?


当前回答

当我在mac osx上安装aglio时,我也得到了这个警告。

我使用cmd修复它。

sudo npm install -g npm@next

https://github.com/npm/npm/issues/13806

其他回答

正如其他人所指出的那样,提高限额并不是最好的答案。我也面临着同样的问题,但在我的代码中,我没有使用任何事件侦听器。当我仔细研究代码时,我有时会创建很多承诺。每个承诺都有一些抓取所提供URL的代码(使用一些第三方库)。如果你正在做类似的事情,那么它可能是原因。

在使用ES6的Promise.all()时,限制并发性的最佳方法是什么?

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');

将.on()替换为once()。使用once()在同一函数处理事件时删除事件监听器。

如果这不能解决问题,那么在package.json中重新安装restler :“restler git: / / github.com/danwrong/restler.git # 9 d455ff14c57ddbe263dbbcd0289d76413bfe07d”

这与restler 0.10对node的错误行为有关。你可以在这里看到git关闭的问题:https://github.com/danwrong/restler/issues/112 然而,npm还没有更新这个,所以这就是为什么你必须引用git头。

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

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

错误就消失了:)

节点版本号:v11.10.1

来自堆栈跟踪的警告消息:

process.on('warning', e => console.warn(e.stack));
(node:17905) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 wakeup listeners added. Use emitter.setMaxListeners() to increase limit
MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 wakeup listeners added. Use emitter.setMaxListeners() to increase limit
    at _addListener (events.js:255:17)
    at Connection.addListener (events.js:271:10)
    at Connection.Readable.on (_stream_readable.js:826:35)
    at Connection.once (events.js:300:8)
    at Connection._send (/var/www/html/fleet-node-api/node_modules/http2/lib/protocol/connection.js:355:10)
    at processImmediate (timers.js:637:19)
    at process.topLevelDomainCallback (domain.js:126:23)

在搜索github问题,文档和创建类似的事件发射器内存泄漏后,由于node-apn模块用于iOS推送通知,观察到此问题。

这就解决了问题:

您应该为每个进程只创建一个Provider 您拥有的证书/密钥对。您不需要创建一个新的 每个通知的提供者。如果你只是发送通知 一个应用程序,那么就不需要一个以上的提供商。 如果你经常在你的应用程序中创建Provider实例,make 当你使用完每个提供者时,一定要调用provider .shutdown() 释放其资源和内存。

每次发送通知时,我都在创建提供者对象,并期望gc将其清除。