我正在尝试从收件箱中获取所有消息,并对其进行解析,然后将其发送到另一台服务器。
这是我的代码:
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将同时启动的解析数限制为较低的数。