2013-02-27 61 views
0

一個嵌套函數我使用一個函數來檢查用戶是否已經註冊的網站上。 但我無法弄清楚如何獲得的rows值該功能的selectEmail()獲得一個變量出的Node.js

我試圖將其存儲內temp,但似乎它存儲它自己的本地版本中,我一旦查詢部分結束,留下一個空變量。

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是異步的,這意味着其餘代碼執行之前不會完成。這意味着,temp不具有價值,當你達到if(temp==""){

爲了解決這個問題,使用了回調。回調是一種代碼完成後調用的函數,在本例中爲connection.query()。這正是你在這種情況下,除了不太正確格式化:

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

這裏selectEmail()是回調,但回調應提供的函數指針,或者匿名函數(沒有名字):

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等)。您還需要注意,在調用這兩種情況之前,將根據連接情況經過一段時間。