2017-02-16 78 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

哦抱歉是生病包括它 –

相關問題