MaxListenersExceededWarning:可能的EventEmitter内存泄漏检测

时间:2019-07-19 15:52:28

标签: javascript node.js puppeteer

我已经阅读了此错误并知道了它的含义,并且还知道如何通过将var x = JsonConvert.DeserializeObject<DTO>(result[0]); 设置为var y = JsonConvert.DeserializeObject<IEnumerable<DTO>>(Newtonsoft.Json.JsonConvert.SerializeObject(result.ToArray())); 来禁用它。但是我想知道是什么原因造成的,所以我可以正确地处理它。

因此,基本上,这里是一个用于检查我的帐户是否有新消息的机器人,我需要一次检查很多帐户,因此我编写了此机器人来做到这一点。我在这段代码中有4个功能。

MaxListeners

我有时会在console.logs之间出现此错误

0

我不确定是什么原因引起的,还是很严重?

2 个答案:

答案 0 :(得分:1)

通常在调用太多异步函数而未完成时发生。并且鉴于所有异步函数都具有min timeout(0ms),因此它们总是被压入堆栈的末尾,并且在调用其中许多函数之前,它们都不会完成。

无论如何,如果您试图让大量异步事件并行发生,

  

通过将MaxListeners设置为0来禁用它

process.setMaxListeners(0);

或者,您可以使用for循环(而不是forEach),将其包装在带有await的异步函数中,以使您的代码完全同步。如果运行时没有对象,则可以使日志记录更好。

// example of de-parallelizing
(async () => {
  const userIds = await myDb.getAllUserIds();
  const usersWithoutFirstnames = [];

  for (userId of userIds) {
    console.log("Getting first name of user:", userId);
    const firstName = await myDb.getFirstName(userId);

    if (firstName) {
      console.log("SUCCESS: ", firstName);
    } else {
      console.log("First name not found");
      usersWithoutFirstnames.push(userId);
    }
  }
})(); // closures are back

答案 1 :(得分:0)

我认为问题与这些部分有关:

setInterval(function(){
  if(!inprogress)
    {
      init();
    }
}, 2000);
async function init(){

  ...

  browser._process.once('close', () => {
    console.log(' ------------------------  closed !');
    inprogress = false;
  });

  browser.on('disconnected', () => {
    console.log(' ------------------------  disconnecte !');
    inprogress = false;
  });

  ...

}

您每2秒触发两个事件侦听器(如果inprogress等于false),但是只有在进程遇到fatalerror时才关闭这些侦听器。

if(check === 'fatalerror') {
  await browser.close();
}

因此,按照您代码的逻辑,我认为大多数closedisconnected侦听器仍在侦听/等待事件发生,例如您收到的警告,您可能已经同时有11位听众。取决于返回值check,您应该始终关闭browser实例,我认为这两个事件侦听器都可以被使用并正确释放内存。