2016-10-20 42 views
1

私はしばらくこのままでいましたが、何が間違っているのか分かりません。私はMySQLの関数を実行するDatabse.jsと呼ばれる別のクラスを持っています、それは接続、クエリなどを管理しています。私はそれを返す必要があります1行の情報フォームを取得しようとしている(正しいユーザー名とパスワード)しかし、それは変数が定義されていないと言います。私が関数を返す前にオブジェクトのフィールドを関数に記録すると、それらはすべて正常に動作します。ここで関数の戻り値は定義されていません

もう少し文脈を持つコードです:問題を抱えたオブジェクトを呼び出す関数である

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

、ここでは(私は私のモジュールを用意しましたDatabse.jsからcheckAccount()関数です。輸出それは場合に役立ちます):

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; 

任意の助けをいただければ幸いです! c:

答えて

1

function checkAccount(username, password) {には戻り値がありません。

query(query, callback)に渡す関数のみが値を返します。照会機能は非同期であるため、promiseを返すか、またはコールが準備完了したときにコールバックを呼び出す必要があります。コールバックと約束についてもっと読むべきです。ここに:

function checkAccount(username, password) { 
    return con.query(... 

とそのように

checkAccount(xxx).then(function(data) { 
    // your data is here 
}); 
を約束を使用する:あなたはそれを使用するどのようなデータベース実装に応じて http://sporto.github.io/blog/2012/12/09/callbacks-listeners-promises/

は、クエリ機能は、あなたがこれを行うことがより約束を、返すこと可能性があります

関連する問題