(节点)警告:检测到可能的EventEmitter内存泄漏。 11名听众补充道。使用emitter.setMaxListeners()来增加限制。跟踪

时间:2013-12-16 07:45:25

标签: node.js parsing

我试图从收件箱中获取所有邮件并解析它然后将其发送到另一台服务器。

这是我的代码:

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)

我不知道为什么会这样。

2 个答案:

答案 0 :(得分:1)

编辑:正如Paul所说,你甚至不允许在一个MailParser上一次启动多个解析,因此你需要为每个解析创建一个新的解析。执行此操作时,限制不再适用,您可以使用现有循环。我将保留下面的文字,因为它解释了该消息,仍然适用于其他类似的情况。


消息的含义是您在一个EventEmitter(MailParser)上同时开始解析超过10条消息。你的循环每次迭代开始一次解析,永远不会等待任何先前的解析完成。

如果这就是你要做的事情(在这种情况下不是因为每个MailParser只能有一个运行解析),你需要提高EventEmitter限制以允许它(执行错误消息)告诉你)。因为我所看到的循环可以循环遍及理论上无限数量的消息而你试图并行解析所有这些消息,这可能不是最好的事情。

如果那个你有意做什么,你有几个选择。您需要为每个解析创建一个新的MailParser(限制仅适用于每个EventEmitter),或者您可能需要查看async库并使用例如eachSerieseachLimit来将同时启动的解析数限制为较低的数字。

答案 1 :(得分:1)

您的代码存在多个问题:

  • 假设我正确理解andris9/mailparser的文档,MailParser对象应该解析一封电子邮件,而只能解析一封。但是,您创建了一个解析器并使用许多消息提供它,这将不会产生预期的结果;
  • 你在同一个MailParser的end事件上听了很多次,所以Node.js警告你,你正在做的事情可能不是你打算做的。例如,参见this question,其中海报类型面临同样的问题。

相反,我建议采用以下解决方案:

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() method代替on()