(节点:6261)MaxListenersExceededWarning:检测到可能的 EventEmitter 内存泄漏

Posted

技术标签:

【中文标题】(节点:6261)MaxListenersExceededWarning:检测到可能的 EventEmitter 内存泄漏【英文标题】:(node:6261) MaxListenersExceededWarning: Possible EventEmitter memory leak detected 【发布时间】:2018-10-31 06:23:56 【问题描述】:

我在 nodejs 应用程序上收到此错误: 节点版本:v8.11.1

(node:6261) MaxListenersExceededWarning: Possible EventEmitter memory leak
detected. 11 wakeup listeners added. Use emitter.setMaxListeners() to increase
limit

我有一个使用 node-apn 将通知推送到 ios 设备的非常简单的代码。 代码运行良好,我也在设备上收到推送通知

var express               = require('express')
  , serverPort            = 6900
  , app                   = express()
  , http                  = require('http')
  , https                 = require('https')
  , fs                    = require('fs')
  , apn                   = require('apn')
;

var server = http.createServer(function (req, res) 
  res.writeHead(200, 'Content-Type': 'text/plain');
  res.write('Hello!');
  res.end();
);

server.listen(serverPort, (err) => 

  if(err)  return console.log("Something bad happened", err); 
);

var apnOptions = 

  token: 
  ,
  production: false 
;

var apnProvider = new apn.Provider(apnOptions);
var note        = new apn.Notification();

note.expiry     = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now.
note.badge      = 3;
note.sound      = "ping.aiff";
note.alert      = "\uD83D\uDCE7 \u2709 You have a new message";
note.payload    =  'messageFrom': 'John Appleseed' ;
note.topic      = "com.example.test";

apnProvider.send(note, '6A752501A5DAFF9DCSFRE56C5B0E699385CD14B586CEF4B9C5012DDA4').then( (result) => 

  console.log(result); 
);

这里的问题在于 APN 代码,因为一旦我评论 APN 代码,我就不会再遇到这个错误了。 谁能知道我的代码有什么问题?我觉得我已经在这里完成了所有事情,但我仍然面临这个问题。

【问题讨论】:

你见过this question或this comment in Github吗?不幸的是,问题很可能出在node-apn。请发布堆栈跟踪和您正在使用的node-apn 版本。 【参考方案1】:

有两种解决方案。两者都与更新最大数量的侦听器有关,都应在代码开头添加。

1- 您可以为如下事件侦听器设置 0,这是有风险的,因为您基本上是在取消限制:

const emitter = new EventEmitter()
emitter.setMaxListeners(0)

2- 全局修复错误,设置一个高值作为最大值像

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

参考1:https://nodejs.org/docs/v0.4.7/api/events.html#emitter.setMaxListenershttps://nodejs.org/docs/v0.4.7/api/events.html#emitter.setMaxListeners

参考2:possible EventEmitter memory leak detected

【讨论】:

@StormTrooper 当然,让我知道 :)【参考方案2】:

node-apn 有several issues,尝试使用node-apn-http2

npm install node-apn-http2

替换, apn = require('apn')

, apn = require('node-apn-http2')

【讨论】:

以上是关于(节点:6261)MaxListenersExceededWarning:检测到可能的 EventEmitter 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

递归--练习2--noi6261汉诺塔

Loj #6261. 一个人的高三楼

loj#6261. 一个人的高三楼

「loj#6261」一个人的高三楼

如何搭建MTK6261的开发环境

MT6261菜单创建(实例代码,含窗口控件NVRAM的使用)