2016-10-20 4 views
1

저는 한동안 붙어 있었고 무엇이 잘못되었는지 알지 못합니다. 나는 MySQL 함수를 실행하는 Databse.js라고 불리는 별도의 클래스를 가지고있다. 연결, 쿼리 등을 관리한다. 나는 올바른 형태의 사용자 이름과 패스워드를 가진 사용자가 반환해야하는 1 행의 정보를 얻기 위해 노력하고있다.) 그러나 그것은 변수가 정의되지 않는다고 말한다. 함수를 반환하기 전에 객체 필드를 로그하면 모든 것이 잘 동작합니다. 여기 함수에 대한 반환 값은 정의되지 않았습니다

좀 더 컨텍스트 코드입니다 : Databse.js에서 checkAccount() 함수를 여기에, 고생 한 객체를 호출 할 수있는 기능 즉

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

(내 모듈을 포함 시켰습니다. 수출이 도움이 된 경우) :

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을 반환하거나 호출 준비가되면 콜백을 호출해야합니다. 콜백과 약속에 대해 더 읽어야합니다. 여기 : http://sporto.github.io/blog/2012/12/09/callbacks-listeners-promises/

당신이 당신이 할 수있는 것보다 쿼리 기능, 약속을 반환 가능하다 무엇을 사용 데이터베이스 구현에 따라 :

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

을 그런 식으로

checkAccount(xxx).then(function(data) { 
    // your data is here 
}); 
의 약속을 사용
관련 문제