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

时间:2017-02-16 23:36:53

标签: javascript sql node.js

我已经为我的服务器创建了一个事件监听器,当有人试图登录时会监听,所以我会进行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));

我听说承诺会解决这个问题,但有没有简单的方法呢?,提前谢谢

1 个答案:

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