2012-11-13 31 views
3

我對nodejs非常陌生,並且有一個問題。在函數中使用node-mysql

試圖創建一個函數,將調用這裏我提它的ID從表中的任何字段的值:

function getUserInfo (userID, dynamicField) { 
    var query = connection.query('SELECT '+dynamicField+' from users WHERE userID = '+connection.escape(userID)); 
    query.on('result', function(row) { 
     return(row.dynamicField); 
    }); 
}; 
console.log(getUserInfo(8, userEmail)) //this should get me the userEmail value of the user with userID=8 

不過,我得到「未定義」。如果我使用console.log而不是返回值,它會記錄這個值,但這沒有用作一個函數用於其他函數內部以獲取值。

我會很高興,如果我能得到幫助修改功能。

回答

8

這是異步/ nodejs初學者常見的錯誤。你基本上已經在一個同步函數內包裝了一個異步函數,該函數打破了節點事件循環的本質。返回表達式需要用回調代替。見下:

// Method 
function getUserInfo (userID, dynamicField, callback) { 
    var query = connection.query('SELECT '+dynamicField+' from users WHERE userID = '+connection.escape(userID)); 
    query.on('result', function(row) { 
     callback(null, row.dynamicField); 
    }); 
}; 

// Implementation 
getUserInfo(8, userEmail, function(err, result){ 
    console.log(err || result); 
}); 

按照慣例,在Nodejs中,我們總是首先在回調中傳遞一個錯誤對象。在這種情況下,由於沒有錯誤需要捕獲,我們在它的位置傳遞null。

+2

是的,不認爲PHP(同步)的方式似乎需要時間。非常感謝。 – umutm

+0

雖然我已經將它標記爲「接受的答案」,但在嘗試完代碼之後,我仍然收到「未定義」的問題。 我只是改變這一行 getUserInfo(8 USEREMAIL,功能(ERR,結果){ 到 getUserInfo(8 'USEREMAIL',函數(ERR,結果){ 但沒有運氣.. – umutm

+0

我只是錯過了一些簡單的(括號):? 回調(空,行[dynamicField]; – umutm