2 javascript mysql node.js socket.io
我在做一个游戏socket.io和mysql,并在每个客户端连接,我检查,如果用户是通过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)
哪里出了问题?
每当您在单个事件发射器上为同一事件附加超过10个(默认)侦听器时,Node.js会发出警告.
在您的特定情况下,每次进行SQL查询时都会将error侦听器附加到connection对象.这可能不是你想要的,因为如果第一个x查询执行正常,但是一个失败,那么error先前查询的那些处理程序仍然会被调用.
虽然我没有使用mysql库的实际经验,但第一件事就是你完全忽略了回调的err参数connection.query().你不能忽视这些,除非你想花几个小时调试一段看似有效的代码.
似乎不是将error处理程序附加到connection,而是简单地检查err参数.
PS.通常的做法是始终将执行期间发生的任何错误作为基于回调的API中的第一个参数传递(
null如果没有错误,则指定).你的callback功能似乎不遵循这种做法.
| 归档时间: |
|
| 查看次数: |
724 次 |
| 最近记录: |