【问题标题】:Warning when connecting to MongoDB: "warning: possible EventEmitter memory leak detected"连接到 MongoDB 时出现警告:“警告:检测到可能的 EventEmitter 内存泄漏”
【发布时间】:2014-09-24 13:55:20
【问题描述】:

我遇到了 Node.js 中的事件发射器警告问题。我正在尝试使用Mongoskin 连接到 MongoDB。您能否向我解释为什么会出现警告以及如何避免它?

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)

【问题讨论】:

  • 你知道吗,如何摆脱这个警告以及它的原因是什么?
  • @AvaniKhabiya 据我记得,由于另一个要求,我们放弃了使用 mongodb 转而使用 aurora/mysql,所以我已经忘记了这个问题的修复。对不起。

标签: node.js mongodb eventemitter


【解决方案1】:

您正在执行的代码(我假设这是因为 self.channel_data 包含 51 个键)导致将 51 个侦听器添加到 EventEmitter。为了帮助防止内存泄漏,当您添加超过 n 侦听器(默认为 10 个)时,EventEmitters 会抛出警告 - 您在本例中就是这样做的。

为了修复它,您需要将 EventEmitter 最大侦听器数量设置为 51 以上 - 比如说 75。Here are the docs for that change

eventemitter.setMaxListeners(75);

我没有足够的使用 Mongo 驱动程序的经验来确定您的 eventemitter 在哪里,但这就是错误。

【讨论】:

    【解决方案2】:

    如果您查看node_modules/mongoskin/lib/utils.js,您可以在第 45 行看到他们专门将最大侦听器设置为 50。

    this._emitter.setMaxListeners(50);
    

    你可以做的是全局更改它,或者只是在js文件中自己编辑它。

    this._emitter.setMaxListeners(0);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      • 2018-08-13
      • 2011-10-23
      • 1970-01-01
      相关资源
      最近更新 更多