NodeJS内存泄漏

2 javascript mysql node.js socket.io

我在做一个游戏socket.iomysql,并在每个客户端连接,我检查,如果用户是通过IP与禁止我自定义的MySQL函数:

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


但是当我连接> 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)
Run Code Online (Sandbox Code Playgroud)

这是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;
Run Code Online (Sandbox Code Playgroud)

哪里出了问题?

Rob*_*ann 5

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

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

补救

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

似乎不是将error处理程序附加到connection,而是简单地检查err参数.

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