(节点)警告:检测到可能的EventEmitter内存泄漏。添加了11个错误监听器。使用emitter.setMaxListeners()来增加限制

时间:2016-06-08 10:50:39

标签: node.js postgresql memory-leaks connection node-postgres

我正在使用pg节点模块来连接数据库。我一直在为每个DML操作创建多个连接。当连续查询执行发生时 我收到警告消息"(节点)警告:检测到可能的EventEmitter内存泄漏。添加了11个错误监听器。使用emitter.setMaxListeners()来增加限制。"给定的pg默认值poolSize为5。

 var pg = require('pg')
 pg.defaults.poolSize = 5;
 var dbHelper = {
 initializeConnection: function (callback) {
    pg.connect(conString, function (err, client, done) {
        if (err) {
            done(client);
            return callback(err, null);
        }
        callback(null, client, done);
    });

    pg.on('error', function (err) {
    });
    pg.end();
},
  query: function (pgQuery, args, callback, options) {
    this.initializeConnection(function (err, client, done) {
           client.query(pgQuery, args, function (err, response) {
            done();
            return callback(err, response);
        });
    });
},
};

 module.exports = dbHelper;

示例查询

 dbHelper.query("SELECT name,age,address FROM EMPLOYEE WHERE id=$1", [1001], function (err, response) {
        callback(err, response);
    });

如何防止事件发射器内存韭菜。

1 个答案:

答案 0 :(得分:0)

原因是您没有正确释放连接:

pg.connect(conString, function (err, client, done) {
      if (err) {
          done(client);
          return callback(err, null);
      }
      callback(null, client, done);
  });

这应该是:

pg.connect(conString, function (err, client, done) {
    if (err) {
        callback(err, null);
    } else {
        callback(null, client);
        done();
    }
});

即。如果没有错误,请致电done()

如果你想完全避免这种错误 - 请查看pg-promise;)