2016-10-20 3 views
1

Ich habe eine Weile daran fest und ich weiß nicht, was los ist. Ich habe eine separate Klasse namens Database.js, die die MySQL-Funktionen ausführt, sie verwaltet die Verbindung, Abfragen usw. Ich habe versucht, es zu bekommen, um Informationen aus der 1 Zeile zu erhalten, die es zurückgeben sollte (Ein Benutzer mit dem richtigen Benutzernamen und Passwort)) aber es sagt, die Variable ist undefiniert. Wenn ich die Objektfelder in der Funktion protokolliere, bevor ich sie zurückgebe, funktionieren alle gut.Rückgabewert für eine Funktion ist undefined

Hier ist der Code mit einem wenig mehr Kontext:

socket.on('loginAttempt', function(data) { 
    //Check credentials with database... 
    try { 
     var fuser = Database.checkAccount(data.username, data.password); 
     if (fuser === undefined) {//This is always being called 
      console.log("fuser is undefined");//For debug only 
     } 
    } catch(err) { 
     console.log(err.message); 
    } 
    try { 
     if (fuser !== undefined) { 
      socket.emit('loginMessage', {status:true}); 

      socket.id = Math.random(); 
      SOCKET_LIST[socket.id] = socket; 

      var player = Player(socket.id, fuser.Username, fuser.Rank, fuser.Points); 
      PLAYER_LIST[socket.id] = player; 
      return; 
     } 
     socket.emit('loginMessage', {status:false}); 
    } catch(err) { 
     console.log(err.message); 
    } 
}); 

, dass die Funktion, die das unruhige Objekt aufruft, hier ist die checkAccount() Funktion von Databse.js (Ich habe mein Modul enthält. wenn das hilft) Exporte:

function checkAccount(username, password) { 
con.query("SELECT * FROM Userbase WHERE Username='" + username + "' AND Password='" + password + "';", function(err, rows) { 
    if (err) throw err; 
    if (rows.length > 0) { 
     var returnedUser = new User(); 
     returnedUser.Username = username; 
     returnedUser.Password = password; 
     returnedUser.Rank = rows[0].Rank; 
     returnedUser.Points = rows[0].Points; 
     return returnedUser; // This should return the User object however when run in my app.js it is undefined 
    } 
    return null; 
}); 

}

module.exports.mysql = mysql; 
module.exports.con = con; 
module.exports.checkAccount = checkAccount; 
module.exports.User = User; 
module.exports.init = init; 

Jede mögliche Hilfe würde geschätzt! c:

Antwort

1

Ihre function checkAccount(username, password) { hat keinen Rückgabewert.

Nur die Funktion, die Sie an query(query, callback) übergeben, gibt einen Wert zurück. Da die Abfragefunktion asynchron ist, sollte sie eine promise zurückgeben oder einen Rückruf aufrufen, wenn der Anruf bereit ist. Sie sollten mehr über Rückrufe und Versprechen lesen. hier: http://sporto.github.io/blog/2012/12/09/callbacks-listeners-promises/

Je nachdem, welche Datenbank-Implementierung Sie verwenden es möglicherweise, dass die Abfrage-Funktion ein Versprechen gibt, als Sie dies tun könnte:

checkAccount(xxx).then(function(data) { 
    // your data is here 
}); 
auf diese Weise
function checkAccount(username, password) { 
    return con.query(... 

und verwenden Sie das Versprechen