2013-02-27 4 views
0

나는 사용자가 이미 사이트에 등록되어 있는지 확인하는 기능을 사용하고 있습니다. 그러나 나는 기능에서 rows의 값을 얻을 방법을 알아낼 수 없습니다 selectEmail()Node.js의 중첩 된 함수에서 변수 가져 오기

내가 temp 내에 저장하기 위해 노력하고있어,하지만 그것의 자신의 로컬 버전에서 보관하는 것, 그리고 I 쿼리 부분이 끝나면 빈 변수를 남겼습니다.

function checkEmail(email, req, res){ 
    var temp; 
    dbConnect(req,res); 
    var query = 'SELECT EMAIL FROM USERS WHERE EMAIL="'+email+'"'; 
    connection.query(query, function selectEmail(err,rows,fields){ 
    if (err) { 
     throw err; 
     } 
    temp=rows; 
    }) 
    dbClose(req,res); 
    console.log(temp); 
    if (temp==""){ 
     console.log('No matching email in database'); 
     return 0; 
    } 
    else{ 
     console.log('Duplicate Email detected in database'); 
     return 1; 
    } 
} 

콜백을 사용해야한다는 말을 들었지만 어떻게 작동하는지 알아낼 수 없습니다.

답변

3

connection.query은 비동기식이므로 나머지 코드가 실행되기 전에 완료되지 않는다고 생각합니다. 즉 if(temp==""){에 도달하면 temp에 값이 없습니다.

이 문제를 처리하려면 콜백이 사용됩니다. 콜백은 코드가 완료되면 호출되는 함수이며,이 경우에는 connection.query()입니다.

다음 selectEmail()
connection.query(query, function selectEmail(err,rows,fields){ 
    if (err) { 
     throw err; 
    } 
    temp=rows; 
}) 

콜백이 (이름없이) 함수 포인터, 또는 익명 함수로 제공되어야 것을 제외하고, 콜백이다 : 그것은 아주 제대로 포맷되지 제외하고는,이 경우이 정확히

connection.query(query, function(err,rows,fields){ 
    if (err) { 
     throw err; 
    } 
    temp=rows; 
}); 

이 코드는 checkEmail()이 반환 된 후에 발생합니다. conection.query()이 완료된 후 발생하려는 것은 콜백 또는 의 콜백이어야합니다. 이처럼 : 물론

connection.query(query, function(err,rows,fields){ 
    if (err) { 
     throw err; 
    } 

    dbClose(req,res); 

    if (rows==""){ 
     console.log('No matching email in database'); 
     handleEmailCheckFailure(); 
    } 
    else{ 
     console.log('Duplicate Email detected in database'); 
     handleEmailCheckSuccess(); 
    } 
}); 

, 당신은 검사가 성공 여부에 따라 값을 반환 checkEmail()를 기대합니다. 비동기 호출에서는 작동하지 않습니다. 통과 및 실패 사례 (위의 handleEmailCheckFailure 등)를 처리하는 함수가 있어야합니다. 또한 이러한 경우 중 하나가 호출되기 전에 연결에 따라 약간의 시간이 경과한다는 사실을 알고 있어야합니다.

관련 문제