2017-02-16 3 views
0

Ich habe einen Ereignis-Listener für meinen Server gemacht, der zuhört, wenn jemand versucht, sich anzumelden, also mache ich eine SQL-Abfrage und dann, wenn die Informationen übereinstimmen, protokolliert sie auf. Problem ist, es testet, wenn die Info übereinstimmt, bevor es die Abfrage ausführt, so dass es immer false zurückgibt. hier ist mein CodeFunktion wird ausgeführt, bevor SQL-Abfrage beendet ist, Knoten 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)); 

Ich habe gehört, verspricht dieses Problem beheben wird aber gibt es eine einfache Möglichkeit, dies zu umgehen ?, Vielen Dank im Voraus

+0

Diese Frage wird die ganze Zeit gefragt. Sie müssen * innerhalb * des Rückrufs antworten. Ersetzen Sie einfach 'logIn = true;' mit dem Code, den Sie unten ausführen wollten. –

+0

Ich bekomme den Fehler "kann Eigenschaft nicht lesen 'emit' von undefined", wenn es versucht, mich anzumelden –

Antwort

1

Das Problem, das Sie haben, ist Ihre if(login == true) außerhalb des Abschluss-Handler der Abfrage .

Verschieben Sie die if(logIn == true) in Ihren Beendigungshandler.

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

Jetzt ist der Grund, warum es genannt wird, ist Ihre connection.query läuft asynchron, weshalb die function Handler verwendet wird. Code außerhalb des Completion-Handlers wird sofort ausgeführt.

EDIT aus Zusätzlichen Änderungen

Basierend auf Änderungen Ihr this Umfang wird geändert werden, wenn innerhalb der Abschluss-Handler-Funktion bewegt. Um eine Referenz zurück zu bekommen, benötigen Sie einen Verweis auf den Bereich player (vorausgesetzt, dass this ist). So kann das einfach gehandhabt werden, indem man eine Variable von diesem als var that = this; an der Oberseite deiner checklogin Funktion erstellt. Etwas wie:

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

dann bekomme ich den Fehler "kann Eigenschaft 'emit' von undefined nicht lesen", wenn es versucht, einloggen –

+0

'emit' was? Fehlt Ihnen in Ihrem Beispiel Code? – Nico

+0

oh sorry ja krank include it –

Verwandte Themen