2017-02-16 65 views
0

我为我的服务器制作了一个事件监听器,用于监听某人何时尝试登录,所以我做了一个sql查询,然后如果信息匹配,它会记录它们上。问题在于,如果信息在运行查询之前匹配,那么它的测试将始终返回false。这里是我的代码函数在sql查询完成之前运行,节点js

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

这个问题一直在问。你需要在回调中回复*。只需用'logIn = true;'代替你想在底部运行的任何代码。 –

+0

当它尝试登录时,我收到错误“can not read property'emit'undefined” –

回答

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)。所以可以简单地通过在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)); 
+0

然后当它尝试登录时,我收到错误“can not read property'emit'undefined” –

+0

'emit'什么?你的例子中是否缺少代码? – Nico

+0

哦抱歉是生病包括它 –

相关问题