gpt4 book ai didi

javascript - 函数在sql查询完成之前运行,node js

转载 作者:行者123 更新时间:2023-12-03 04:59:39 25 4
gpt4 key购买 nike

我为我的服务器创建了一个事件监听器,用于监听某人何时尝试登录,因此我执行 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));

我听说 promise 会解决这个问题,但是有什么简单的方法可以解决这个问题吗?提前致谢

最佳答案

您遇到的问题是您的 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 )。因此,只需在 checklogin 函数顶部创建一个名为 var that = this; 的变量即可处理此问题。像这样的东西:

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));

关于javascript - 函数在sql查询完成之前运行,node js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42286785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com