我为我的服务器做了一个事件侦听器,当有人试图登录时,它会监听,所以我执行一个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));我听说承诺会解决这个问题,但有什么简单的办法吗?
发布于 2017-02-16 23:40:54
您遇到的问题是您的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));https://stackoverflow.com/questions/42286785
复制相似问题