NodeJS内存泄漏

时间:2016-01-17 14:41:19

标签: javascript mysql node.js socket.io

我正在使用socket.iomysql制作游戏,并且在每个客户端连接时,我都会检查用户是否被我的自定义MySQL功能禁用了IP:

MySQL.Query('SELECT * FROM bans WHERE user = ?', username, function(rows) {
    // do something
})


但是当我连接> 5 客户端,我在服务器控制台上出现此错误:

(node) warning: possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at PoolConnection.addListener (events.js:239:17)
    at C:\Users\user\Documents\_server\mysql\mysql.js:26:21
    at Ping.onOperationComplete [as _callback] (C:\Users\user\node_modules\mysql\lib\Pool.js:99:5)
    at Ping.Sequence.end (C:\Users\user\node_modules\mysql\lib\protocol\sequences\Sequence.js:96:24)
    at Ping.Sequence.OkPacket (C:\Users\user\node_modules\mysql\lib\protocol\sequences\Sequence.js:105:8)
    at Protocol._parsePacket (C:\Users\user\node_modules\mysql\lib\protocol\Protocol.js:280:23)
    at Parser.write (C:\Users\user\node_modules\mysql\lib\protocol\Parser.js:73:12)
    at Protocol.write (C:\Users\user\node_modules\mysql\lib\protocol\Protocol.js:39:16)
    at Socket.<anonymous> (C:\Users\user\node_modules\mysql\lib\Connection.js:96:28)
    at emitOne (events.js:77:13)

这是mysql.js文件

var config = require('../config.js');
var mysql = require('mysql');
var pool = mysql.createPool({
    connectionLimit : 100,
    host     : config.sqlhost,
    user     : config.sqluser,
    password : config.sqlpass,
    database : config.sqlbase,
    debug    :  false
});
var MySQL = {
    Query: function(req, reqvars, callback) {
        pool.getConnection(function(err,connection){
            if (err) {
              connection.release();
              console.log('[MySQL] Error while connecting to the database');
            }   
            connection.query(req, reqvars, function(err,rows){
                connection.release();
                if (typeof callback == 'function') callback(rows);
            });
            connection.on('error', function(err) {      
                console.log('[MySQL] Error while attempting query');   
            });
        });
    }, 
}
module.exports = MySQL;

问题出在哪里?

1 个答案:

答案 0 :(得分:5)

每当您在单个事件发射器上为同一事件附加超过10个(默认)侦听器时,

Node.js会发出警告。

在您的特定情况下,每次进行SQL查询时,都会将error侦听器附加到connection对象。这可能不是你想要的,因为如果第一个x查询执行正常,但是一个失败,那么先前查询的那些error处理程序仍然会被调用。

解决方法

虽然我没有使用mysql库的实际经验,但第一件事就是你完全忽略了err回调的connection.query()参数。你一定不能忽略这些,除非你想花几个小时调试一段看似有效的代码。

似乎不是将error处理程序附加到connection,而只需检查err参数。

  

PS。通常的做法是始终将执行期间发生的任何错误作为基于回调的API中的第一个参数传递(如果没有错误,请指定null)。您的callback函数似乎不遵循这种做法。