2012-06-07 154 views
0

我的自定義模塊中我有這樣的方法,將查詢數據庫,並發現,如果在我的數據庫中存在的用戶名。我想要返回一些值,所以在上層我會知道查詢結果。從的NodeJS一個模塊傳遞值到另一個模塊

var findUserbyUsername=function(username) 
{ 
    db.users.find({email:username},function(err,result) 
    { 

     if(err|!username) {console.log('username not found'); return 0;} 
     else return 1; 
    } 
    ); 
} 
module.exports.findUser=findUserbyUsername; 

在app.js我會請這樣

var lt=dbutil.findUser('[email protected]'); 

上面的方法,但不幸的是我得到了不確定.... 誰能幫助我解決這個?還是有其他建議?

+0

我理解的原因。謝謝大家。 –

回答

2

這是一個異步代碼,當然它不會返回任何東西。您可能需要執行以下操作:

app.js:

dbutil.findUser('[email protected]', function(err, data) { 
    if (err) throw err; 
    // Handle the datas returned "data" 
}); 

模塊:

var findUserByUserName = function(username, callback) { 
    db.users.find({ email: username }, function(err, result) { 
     if (err || !username) { 
      console.log('username not found'); 

      // Call the function passed as parameter 
      callback(err); // You give "undefined" as second parameter 
     } 
     else { 
      callback(err, result); // You give the datas back 
     } 
    }); 
}); 
2

findUserbyUsername功能不返回任何東西,這就是爲什麼你undefined。由於數據庫操作在Node中是異步的,因此不能返回任何有意義的東西並通過回調工作。改變你的代碼是這樣的:

var findUserbyUsername = function(username, callback) { 
    db.users.find({ email: username }, function(err, result) { 
     if (err || !username) { 
      console.log('username not found'); 
      callback(err? err: 'Username not found'); 
     } else { 
      callback(null, whateverYouWantToReturn); 
     } 
    }); 
} 
module.exports.findUser = findUserbyUsername; 

,並使用它像這樣:

dbutil.findUser('[email protected]', function(err, result) { 
    // you have the result from findUserbyUsername() in "result", and "err" is set if there was an error 
}); 

注:我也修正了自己的條件if(err|!username),因爲|是位運算符和你真正想要的||邏輯運算符)

(編輯:添加實際標準err參數到回調)

+0

嘿!請不要忘記'err'參數,它是節點中的一個標準:-)之後我會刪除我的答案。 –

+0

好:)只是雞蛋裏挑骨頭,爲什麼不保持一致,並使用'err',而不是'null'?順便說一句,貌似我不能刪除「接受的答案」,抱歉:( –

+0

似乎更加明確和可讀性。清楚地表明,你已經確定有在這一點上沒有錯誤。 – lanzz

0

的問題是你有你的函數內部異步請求,所以db.users內部回報.find是在錯誤的範圍內,並且永遠不會回到您的請求。

你需要傳遞一個回調函數作爲第二個參數,使代碼看起來是這樣的:

var findUserbyUsername=function(username, cb) 
{ 
    db.users.find({email:username}, cb); 
} 
module.exports.findUser=findUserbyUsername; 

然後,你可以調用該函數是這樣的:

dbutil.findUser('[email protected]', function(err, username) { 
    if (err) { 
     // Handle err 
    } else { 
     // Handle username 
    } 
}) 
相關問題