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

Я получаю сообщение об ошибке «не могу прочитать свойство« испускать »неопределенного« когда он пытается войти в систему –

ответ

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 обработчик используется. Код за пределами обработчика завершения будет запущен немедленно.

EDIT из дополнительных изменений

на основе ваших изменений вашего 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)); 
+0

, тогда я получаю ошибку «не могу прочитать свойство« испускать »неопределенного», когда он пытается войти в систему –

+0

'emit' what? Вам не хватает кода в вашем примере? – Nico

+0

oh извините да плохо включите его –

Смежные вопросы