我试图从收件箱中获取所有邮件并解析它然后将其发送到另一台服务器。
这是我的代码:
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)
我不知道为什么会这样。
答案 0 :(得分:1)
消息的含义是您在一个EventEmitter(MailParser)上同时开始解析超过10条消息。你的循环每次迭代开始一次解析,永远不会等待任何先前的解析完成。
如果这就是你要做的事情(在这种情况下不是因为每个MailParser只能有一个运行解析),你需要提高EventEmitter限制以允许它(执行错误消息)告诉你)。因为我所看到的循环可以循环遍及理论上无限数量的消息而你试图并行解析所有这些消息,这可能不是最好的事情。
如果那个不你有意做什么,你有几个选择。您需要为每个解析创建一个新的MailParser(限制仅适用于每个EventEmitter),或者您可能需要查看async
库并使用例如eachSeries或eachLimit来将同时启动的解析数限制为较低的数字。
答案 1 :(得分:1)
您的代码存在多个问题:
andris9/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()