阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      Node.js events emitter.setMaxListeners

      Node.js events emitter.setMaxListeners(n)

      新增于: v0.3.5

      • n < integer>
      • 返回: < EventEmitter> 默认情况下,如果为特定事件添加了超过 10 个监听器,则 EventEmitter 会打印一个警告。 这有助于发现内存泄露。

      但是,并不是所有的事件都要限制 10 个监听器。

      emitter.setMaxListeners() 方法可以为指定的 EventEmitter 实例修改限制。 值设为 Infinity(或 0)表示不限制监听器的数量。

      返回对 EventEmitter 的引用,以便可以链式调用。

      常见错误解决

      如果您遇到类似下面的错误;使用 request 等模块发送请求,当请求多的时候就出现这个警告!

       (node) warning: possible EventEmitter memory leak detected. 11 listeners added. 
       Use emitter.setMaxListeners() to increase limit.
      Trace
          at Socket.EventEmitter.addListener (events.js:168:15)
          at Socket.EventEmitter.once (events.js:189:8)
          at Socket.setTimeout (net.js:173:12)
          at ClientRequest.setTimeout (http.js:1557:17)
          at ClientRequest.setTimeout (http.js:1569:10)
          at ClientRequest.g (events.js:185:14)
          at ClientRequest.EventEmitter.emit (events.js:115:20)
          at ClientRequest.onSocket (http.js:1514:9)
          at process.startup.processNextTick.process._tickCallback (node.js:244:9)
      

      治标方法:

      var req=http.request(options,function(res){
          //......
      });
      /** 此处为req.once,而非req.on,二者区别见官方文档api说明**/
      req.once('socket',function(socket){
          /** 默认listener数是10,提高到20应该足够**/
          socket.setMaxListeners(20);
      });
      

      治本的方法,推荐使用下面这种的

      将timeout的回调函数独立出来,在response事件之后手动注销timeout的监听

      var req=http.request(options,function(res){
          req.removeAllListeners();//clear out all listeners
          req.setTimeout(0,timeout_callback);//clear out timeout listener
          //do more work.......
      });
      function timeout_callback(){
          //abort request?......
      }
      /** for example, timeout in 30s**/
      req.setTimeout(30000,timeout_callback);
      

      更多node event中的方法属性和事件,可以进入 node events EventEmitter 类 进行查看


      更多内容请参考:Node.js events 事件触发器,或者通过 点击对应菜单 进行查看;


      目录
      本文目录
      目录