【问题标题】:(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit. Trace(节点)警告:检测到可能的 EventEmitter 内存泄漏。增加了 11 位听众。使用emitter.setMaxListeners() 增加限制。痕迹
【发布时间】:2014-01-03 12:54:06
【问题描述】:

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

这是我的代码:

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)

我不知道为什么会这样。

【问题讨论】:

    标签: node.js parsing


    【解决方案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()

    【讨论】:

      【解决方案2】:

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


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

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

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

      【讨论】:

        猜你喜欢
        • 2012-09-04
        • 2012-12-08
        • 1970-01-01
        • 2016-06-12
        • 2016-10-08
        • 2018-11-15
        • 1970-01-01
        • 2016-05-05
        • 2021-03-13
        相关资源
        最近更新 更多