2014-05-16 2 views
0

콜백을 이해하는 몇 가지 문제가, heres는노드 JS 콜백

function authenticate(username, password, callback) { 
    var query = "SELECT * from mydb.users where username='" + username + "'and BINARY password='" + password + "'"; 
    connection.query(query, function (err, rows) { 
     if (rows[0] != undefined) { 
      if ('username' in rows[0]) { 
       if (rows[0].username == username) { 
        callback(true); 
       } 
      } 
     } 
     callback(false); 
    }); 
}; 

exports.assets=function(req,res) { 
    var username = req.param("username"); 
    var password = req.param("password"); 

    authenticate(username, password, function (didAuthenticate) { 
     if (didAuthenticate) { 
      console.log("Authenticated"); 
     } 
     else { 
      console.log("Failed"); 
     } 
    }); 
}; 

출력이 때 사용자/일치 통과 (MySQL을 통해) 인증을 위해 내 코드 :

Failed 
: 없음 일치로

Authenticated 
Failed 

didAuthenticate가 true를 반환 할 때 if/else 문이 작동하지 않는 이유는 무엇입니까?

답변

4

단순히 callback(...)을 수행하면 함수 실행이 종료되지 않습니다. 다음과 같이 함수가 실행을 멈추도록 지시하는 return 문이 필요합니다.

function authenticate(username, password, callback) { 
    var query = "SELECT * from mydb.users where username='" + username + "'and BINARY password='" + password + "'"; 
    connection.query(query, function (err, rows) { 
     if (rows[0] != undefined) { 
      if ('username' in rows[0]) { 
       if (rows[0].username == username) { 
        return callback(true); 
       } 
      } 
     } 
     return callback(false); 
    }); 
}; 

다른 NodeJS 코드를 읽을 때이 기술이 사용됩니다.

+1

+1 처음 보았을 때 흔히 발생하지만 약간 혼란스러운 패턴입니다. 'returns'는 값을 반환하기 위해 _not_ 거기에 있지 않습니다 (거의 아무도 듣고 있지 않습니다), _flow control_ 만 있습니다. – user949300

+0

완벽. 감사! – user3217789

+0

@ user3217789 : 문제 없습니다! 귀하의 질문에 [답변 수락] (http://stackoverflow.com/help/someone-answers)을 기억하십시오. –

1

return 문을 사용하여 종료하는 대신 실패 조건에 대한 else 문을 넣을 수 있습니다.

function authenticate(username, password, callback) { 
    var query = "SELECT * from mydb.users where username='" + username + "'and BINARY  password='" + password + "'"; 
    connection.query(query, function (err, rows) { 
     if (rows[0] != undefined && rows[0].username === username) { 
      callback(true); 
     } 
     else { 
      callback(false); 
     } 
    }); 
};