我已经为我的服务器创建了一个事件监听器,当有人试图登录时会监听,所以我会进行SQL查询,然后如果信息匹配,则会将其记录下来。问题是,它测试信息在运行查询之前是否匹配,因此它将始终返回false。这是我的代码
player.on('checkLogin', function(data)
{
var logIn = "";
connection.query({
sql: "SELECT * FROM users WHERE username = ?",
values: [data.user] },
function(error, results, fields)
{
if (error)
{
console.log(error);
}
if(results)
{
var pass = "";
for (i = 0; i < results.length; i++)
{
pass = (results[i].password);
}
var input = crypto.createHash('md5').update(data.pass).digest("hex");
if (pass == input)
{
logIn = true;
}
}
});
if (logIn == true)
{
this.em.emit('login',
{
id: player.playerid
});
}
}.bind(this));
我听说承诺会解决这个问题,但有没有简单的方法呢?,提前谢谢
答案 0 :(得分:1)
您遇到的问题是if(login == true)
超出了查询的完成处理程序。
将if(logIn == true)
移动到完成处理程序中。
player.on('checkLogin', function(data)
{
var logIn = "";
connection.query({
sql: "SELECT * FROM users WHERE username = ?",
values: [data.user] },
function(error, results, fields)
{
if (error)
{
console.log(error);
}
if(results)
{
var pass = "";
for (i = 0; i < results.length; i++)
{
pass = (results[i].password);
}
var input = crypto.createHash('md5').update(data.pass).digest("hex");
if (pass == input)
{
logIn = true; //<-- could just handle it here.
}
if (logIn == true) //<-- moved inside completion handler
{
//log on
}
}
});
}.bind(this));
现在调用它的原因是你的connection.query
异步运行,这就是使用function
处理程序的原因。完成处理程序外的代码将立即运行。
来自其他更改的编辑
根据您的更改,当您在完成处理函数内移动时,this
范围将会更改。要获得引用,您需要引用player
范围(假设this
是什么)。因此,只需在var that = this;
函数顶部创建checklogin
变量即可轻松处理。类似的东西:
player.on('checkLogin', function(data)
{
var that = this; //create a variable to store the scope (this)
var logIn = "";
connection.query({
sql: "SELECT * FROM users WHERE username = ?",
values: [data.user] },
function(error, results, fields)
{
if (error)
{
console.log(error);
}
if(results)
{
var pass = "";
for (i = 0; i < results.length; i++)
{
pass = (results[i].password);
}
var input = crypto.createHash('md5').update(data.pass).digest("hex");
if (pass == input)
{
logIn = true; //<-- could just handle it here.
}
if (logIn == true) //<-- moved inside completion handler
{
//log on
that.em.emit('login', //<-- reference `that` not `this`
{
id: player.playerid
});
}
}
});
}.bind(this));