我正在使用socket.io
和mysql
制作游戏,并且在每个客户端连接时,我都会检查用户是否被我的自定义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;
问题出在哪里?
答案 0 :(得分:5)
Node.js会发出警告。
在您的特定情况下,每次进行SQL查询时,都会将error
侦听器附加到connection
对象。这可能不是你想要的,因为如果第一个x查询执行正常,但是一个失败,那么先前查询的那些error
处理程序仍然会被调用。
虽然我没有使用mysql库的实际经验,但第一件事就是你完全忽略了err
回调的connection.query()
参数。你一定不能忽略这些,除非你想花几个小时调试一段看似有效的代码。
似乎不是将error
处理程序附加到connection
,而只需检查err
参数。
PS。通常的做法是始终将执行期间发生的任何错误作为基于回调的API中的第一个参数传递(如果没有错误,请指定
null
)。您的callback
函数似乎不遵循这种做法。