(节点)警告:检测到可能的EventEmitter内存泄漏.增加了11名听众.使用发射器.setMaxListeners



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

这是我的代码:

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)

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

您的代码存在多个问题:

  • 假设我正确理解了andris9/mailparser的文档,那么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);
    });
});

注:

  • 为每条消息创建parser对象
  • 由于我们知道end事件只会发出一次,所以我们使用.once()方法而不是on()

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


消息的意思是,您开始在单个EventEmitter(MailParser)上同时解析10多条消息。您的循环在每次迭代中开始一次解析,并且从不等待任何先前的解析完成。

如果这就是你想要做的(在这种情况下不是这样,因为每个MailParser只能有一个正在运行的解析),你需要提高EventEmitter限制以允许这样做(按照错误消息告诉你的去做)。据我所见,你的循环可能会在理论上无限数量的消息上循环,而你正试图并行解析所有消息,这可能不是最好的做法

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

最新更新