Node.js (节点)警告:检测到可能的EventEmitter内存泄漏。增加了11名听众。使用emitter.setMaxListeners()增加限制。痕迹

Node.js (节点)警告:检测到可能的EventEmitter内存泄漏。增加了11名听众。使用emitter.setMaxListeners()增加限制。痕迹,node.js,parsing,Node.js,Parsing,我正在尝试从收件箱中获取所有邮件,并对其进行解析,然后将其发送到另一台服务器 这是我的代码: client.listMessages(0, function(err, messages) { var parser = new MailParser(self.mailParserOptions); messages.forEach(function(message) { parser.on("end", function(mail) {

我正在尝试从收件箱中获取所有邮件,并对其进行解析,然后将其发送到另一台服务器

这是我的代码:

client.listMessages(0, function(err, messages) 
{
    var parser = new MailParser(self.mailParserOptions);
    messages.forEach(function(message)
    {
       parser.on("end", function(mail) 
      {
        console.log(mail);
      });
      self.client.createMessageStream(message.UID).pipe(parser);
    });
});
这是完美的解析,但我得到了这个错误

(node) warning: possible EventEmitter memory leak detected. 11 listeners added.
 Use emitter.setMaxListeners() to increase limit.
 Trace
at MailParser.EventEmitter.addListener (events.js:160:15)
at Stream.pipe (stream.js:99:8)
at /home/above/Desktop/prabu/inbox.js:75:54
at Array.forEach (native)
at /home/above/Desktop/prabu/inbox.js:70:14
at IMAPClient.<anonymous> (/home/above/Desktop/node_modules/inbox/lib/client.js:1653:13)
at IMAPClient._currentRequest.callback (/home/above/Desktop/node_modules/inbox/lib/client.js:777:25)
at IMAPClient._responseRouter (/home/above/Desktop/node_modules/inbox/lib/client.js:618:30)
at IMAPClient._onServerResponse (/home/above/Desktop/node_modules/inbox/lib/client.js:551:10)
at IMAPLineParser.EventEmitter.emit (events.js:95:17)
(节点)警告:检测到可能的EventEmitter内存泄漏。增加了11名听众。
使用emitter.setMaxListeners()增加限制。
痕迹
在MailParser.EventEmitter.addListener(events.js:160:15)
在Stream.pipe(Stream.js:99:8)
在/home/over/Desktop/prabu/inbox.js:75:54
at Array.forEach(本机)
在/home/over/Desktop/prabu/inbox.js:70:14
在IMAPClient。(/home/over/Desktop/node_modules/inbox/lib/client.js:1653:13)
在IMAPClient.\u currentRequest.callback(/home/over/Desktop/node\u modules/inbox/lib/client.js:777:25)
在IMAPClient.\u responseOuter(/home/over/Desktop/node\u modules/inbox/lib/client.js:618:30)
在IMAPClient.\u onServerResponse(/home/over/Desktop/node\u modules/inbox/lib/client.js:551:10)
在IMAPLineParser.EventEmitter.emit(events.js:95:17)

我不知道为什么会发生这种情况。

编辑:正如Paul指出的,您甚至不允许在单个邮件解析器上一次启动多个解析,因此您需要为每个解析创建一个新的解析。当您这样做时,限制不再适用,您可以使用现有的循环。我将留下下面的文字,因为它解释了这条信息,并且仍然适用于其他类似的情况


该消息的意思是,您在单个EventEmitter(MailParser)上同时开始解析10条以上的消息。您的循环每次迭代都会启动一次解析,从不等待前面的解析完成

如果这正是您想要做的(在本例中并非如此,因为每个MailParser只能有一个正在运行的解析),那么您需要提高EventEmitter限制以允许这样做(按照错误消息告诉您的操作)。因为就我所见,您的循环可以在理论上无限数量的消息上循环,并且您试图并行解析所有消息,所以这可能不是最好的做法


如果这不是你想做的,你有几个选择。您需要为每个解析创建一个新的MailParser(该限制仅适用于每个EventEmitter),或者您可能希望查看
async
库并使用,例如,或者将同时启动的解析数限制为较低的数目。

您的代码存在多个问题:

  • 假设我正确理解了的文档,
    MailParser
    对象应该解析一封电子邮件,并且只解析一封。但是,创建一个解析器并向其提供许多消息,这不会产生预期的结果
  • 您在同一个MailParser的
    end
    事件上听了很多次,因此Node.js会警告您,您所做的可能不是您想要做的。比如说,海报面临着同样的问题
相反,我建议以下解决方案:

client.listMessages(0, function(err, messages)  {
    messages.forEach(function(message) {
        var parser = new MailParser(self.mailParserOptions);
        parser.once("end", function(mail) {
            console.log(mail);
        });
        self.client.createMessageStream(message.UID).pipe(parser);
    });
});
注:

  • 为每条消息创建
    解析器
    对象
  • 因为我们知道
    end
    事件只会发出一次,所以我们使用而不是
    on()