首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数在sql查询完成之前运行,节点js。

函数在sql查询完成之前运行,节点js。
EN

Stack Overflow用户
提问于 2017-02-16 23:36:53
回答 1查看 338关注 0票数 0

我为我的服务器做了一个事件侦听器,当有人试图登录时,它会监听,所以我执行一个sql查询,然后如果信息匹配,它会将它们记录在上面。问题是,它在运行查询之前测试信息是否匹配,所以它总是返回false。这是我的密码

代码语言:javascript
复制
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));

我听说承诺会解决这个问题,但有什么简单的办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-16 23:40:54

您遇到的问题是您的if(login == true)不在查询的完成处理程序之外。

if(logIn == true)移动到完成处理程序中。

代码语言:javascript
复制
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变量来处理这个问题。类似于:

代码语言:javascript
复制
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));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42286785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档