2014-09-24 121 views
0

我在Node.js中发生Event Emitter警告问题。我正尝试使用Mongoskin连接到MongoDB。您能否向我解释为什么警告正在发生以及如何避免?连接到MongoDB时发出警告:“警告:可能发生EventEmitter内存泄漏”

for (j in self.channel_data) { 
      (function(channel, index) { 

       mongo.collection('revenue_share') 
        .find({ approved: true, 
          entity_id: channel.user_channel_id, 
          date_effective: {$lte: +new Date(self.report_data[channel.report_id].end_date).getTime()} 
         }, selectables) 
        .sort({date_effective : -1}) 
        .toArray(function (err, _data) { 

         if (err || !_data.length) { 
          return self.fetched_rev_share(channel, null); 
         } 

         return self.fetched_rev_share(channel, _data[0]); 
        }); 
      })(self.channel_data[j], j); 
} 

这是显示警告:

(node) warning: possible EventEmitter memory leak detected. 51 listeners added. Use emitter.setMaxListeners() to increase limit. 
Trace 
at EventEmitter.addListener (events.js:160:15) 
at EventEmitter.once (events.js:185:8) 
at SkinClass.open (/Users/ninz/Sites/freedom-node-backend/node_modules/mongoskin/lib/utils.js:156:23) 
at SkinClass.SkinCollection._open (/Users/ninz/Sites/freedom-node-backend/node_modules/mongoskin/lib/collection.js:49:17) 
at SkinClass.open (/Users/ninz/Sites/freedom-node-backend/node_modules/mongoskin/lib/utils.js:162:14) 
at SkinClass.SkinCursor._open (/Users/ninz/Sites/freedom-node-backend/node_modules/mongoskin/lib/cursor.js:28:25) 
at SkinClass.open (/Users/ninz/Sites/freedom-node-backend/node_modules/mongoskin/lib/utils.js:162:14) 
at SkinClass.(anonymous function) [as sort] (/Users/ninz/Sites/freedom-node-backend/node_modules/mongoskin/lib/utils.js:116:14) 
at /Users/ninz/Sites/freedom-node-backend/helpers/channel_earnings.js:61:18 
at Query.loop_to_channels [as _callback] (/Users/ninz/Sites/freedom-node-backend/helpers/channel_earnings.js:70:7) 

回答

0

您正在执行(我假设这是因为self.channel_data包含51个键)的代码导致51个监听器被添加到一个EventEmitter。为了帮助防止内存泄漏,当您添加超过n侦听器(默认情况下为10)时,EventEmitter会发出警告 - 您在此情况下执行的操作。

为了解决这个问题,你需要设置EventEmitter max listener的数量超过51个 - 比如说75. Here are the docs for that change

eventemitter.setMaxListeners(75); 

我没有与蒙戈司机足够的经验,找准你的eventemitter是,但那是错误。

0

如果你看一下node_modules/mongoskin/lib/utils.js,你可以在45行看到,他们专门设置最大听众50

this._emitter.setMaxListeners(50); 

你可以做的是在全球范围内改变这种状况,还是自己的编辑在js文件。

this._emitter.setMaxListeners(0); 

0消除了限制(据我所知)。