2013-09-20 2 views
0

Использование NodeJS, Express, Socket.io & node-mysql на сервере в настоящий момент. В настоящее время проблема с одной из функций на сервере не возвращает никаких данных вообще. Я нахожусь на своих концах, пытаясь понять это.Функция Javascript, не возвращающая данные - Node-MySQL

Код функции;

Предполагается вернуть «c», но не работает. На консоли console.log отображается идентификатор и имя пользователя.

function LOGIN_USER(a,b) { 
    // a = username 
    // b = password 
    var c = []; 
    connection.query("SELECT ID FROM GAME_PLAYER WHERE USR = '" + a + "' AND PWD = '" + b + "'", function(err,rows,field) { 
     if (err) throw err; 

      for (var i in rows) { 
       c.ID = rows[i].ID; 
       c.USR = a; 
      } 
      console.log(c.ID + " " + c.USR); 
      return c; 
    }); 

} 

Другой код.

socket.on('login user', function(data) { 
     var c; 

     c = LOGIN_USER(data.username,data.password); 
     console.log(c.ID,c.USR); 
    }); 

После этого console.log происходит сбой моего узла nodeJS. Сказать, что он не может отображать неопределенные и т. Д. И т. Д. Невозможно для жизни меня понять это, любая помощь очень ценится !! :)

+0

Хороший вопрос. Интересно, почему некоторые отсталые парни проголосовали. –

ответ

3

Запрос MySQL является асинхронным, поэтому вы не можете использовать возвращаемое значение в нем. В асинхронном программировании, вы должны использовать обратный вызов, потому что оператор возврата остановит выполнение:

function LOGIN_USER(a, b, callback) { 
    // a = username 
    // b = password 
    var c = []; 
    connection.query("SELECT ID FROM GAME_PLAYER WHERE USR = '" + a + "' AND PWD = '" + b + "'", function (err, rows, field) { 
    if (err) throw err; 
    for (var i in rows) { 
     c.ID = rows[i].ID; 
     c.USR = a; 
    } 
    console.log(c.ID + " " + c.USR); 
    callback(c); 
    }); 
} 

И тогда это то, как вы будете использовать его:

socket.on('login user', function(data) { 
    LOGIN_USER(data.username, data.password, function(c) { 
    console.log(c.ID, c.USR); 
    }); 
}); 

При использовании оператора возврата в функция обратного вызова, она действует так, как если бы вы использовали return;, что в свою очередь просто прекращает выполнение функции. Это как обратный вызов работает:

Вы передаете значения функции, а также другую функцию:

var func = function() { 
    // do something 
}; 

LOGIN_USER(a, b, func); 

Когда пользователь Войти завершен, функция Логин будет вызывать функцию, которая была передана к нему:

function LOGIN_USER(a, b, callback) { 
    // do some work 
    callback(); 
}; 

Итак, вы прошли func() в LOGIN_USER() и LOGIN_USER() называется func(), когда она завершена.

+0

Спасибо, например, человек, очень изо всех сил пытался найти ясный/короткий пример, прежде чем я туда доберусь –

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