2013-04-13 53 views
3

我是nodejs的新手,正在編寫一些需要查詢我的MySQL數據庫並從給定的user_id返回用戶名的代碼。我一直在閱讀你的所有函數應該是異步的。在這種情況下,理想情況下,我希望服務器能夠在發生此查詢時響應其他事件請求。但是,它不是一個特別大的查詢,只返回一個值。也許我應該讓它同步? (如果這是你的答案,改變它的示例代碼會很棒)反正,這裏是我的函數。它在最後一行「return current_username;」附近出現錯誤因爲current_username在那個時候是未定義的。有什麼建議麼?Nodejs異步數據庫功能需要同步答案

function get_current_username(current_user_id) { 
    console.log(' | Entered get_current_username'); 
    sqlq = 'SELECT username FROM users WHERE id = ' + current_user_id; 
    connection.query(sqlq, function(err, rows, fields) { 
     if (err) throw err; 
     var current_username = rows[0].username; 
     console.log(' | the current_username =' + current_username);   
    }); 

return current_username; 

}

+1

只是爲了擊敗你的不良想法:在節點中,答案是** *從不***「使其同步」。 – josh3736

回答

8

傳遞一個回調函數get_current_username,然後調用回調函數從connect.query的回調裏面:

function get_current_username(current_user_id, callback) { 
    console.log(' | Entered get_current_username'); 
    sqlq = 'SELECT username FROM users WHERE id = ' + current_user_id; 
    connection.query(sqlq, function(err, rows, fields) { 
     if (err) throw err; 
     var current_username = rows[0].username; 
     console.log(' | the current_username =' + current_username);   
     callback(current_username); 
    }); 
} 

當你去使用此功能的話,你'd做類似的事:

get_current_username(12345, function(username) { 
    console.log("I am " + username); 
}); 

你也可以檢查沒有使用承諾/期貨。我有一種感覺,我將無法對這些正義做出解釋,所以我會鏈接到這StackOverflow question about understanding Promises

儘管這是一個架構決定 - 有些人更喜歡使用回調,尤其是在編寫旨在供第三方重複使用的模塊時。 (事實上​​,在採用諸如Promise之類的東西之前,最好讓自己的腦袋充分包裹在學習階段的回調中。)

+0

這很好。謝謝。 – Thread7