2017-07-27 42 views
0

這是我的代碼:我的UserModel沒有返回正確的用戶數據查找_id?

var user = UserModel.findOne({ _id: decodedToken.id, }, function (err, user) { 
        if (err) return handleError(err) 
        console.log('inside UserModel user = ', user) // this is what I want to return on the variable user 
       }); 

console.log("Outside userModel = ",user) // the user inside the findOne callback isn't assigned on the variable user? 

裏面的UserModel.findOne回調返回正確的用戶:

{ _id: 5979744a02bcec1dc873a96c, 
    updatedAt: 2017-07-27T05:04:10.313Z, 
    createdAt: 2017-07-27T05:04:10.313Z, 
    fullName: 'kring kring', 
    email: '[email protected]', 
    password: '$2a$08$yiDO.HBGoieBApY8VCHA/Opp6PEpq7.CwZmfc2CkQmQoRfB/ySi4u', 
    __v: 0, 
    active: true } 

但回調外,它返回是這樣的:

Query { 
    _mongooseOptions: {}, 
    mongooseCollection: 
    NativeCollection { 
    collection: Collection { s: [Object] }, 
    opts: { bufferCommands: true, capped: false }, 
    name: 'user', 

幫幫我?

回答

1

那是因爲你的函數實際上返回一個Mongoose查詢,你可以稍後使用它來調用exec方法並使用它來獲得結果。

您現在需要執行一個查詢得到的結果:

user.exec(function(err,result){ 
    if(err) 
     return console.log(err); 
    console.log(result); 
}); 

您可以詳細瞭解如何與貓鼬查詢@http://mongoosejs.com/docs/queries.html

+0

它仍然是一樣的,你可以用我的代碼做出答案?我在查詢下面嘗試了user.exec(),仍然無法正常工作。 –

+0

您運行exec時是否收到錯誤消息?它輸出到控制檯的是什麼? –

+0

沒有錯誤,但它返回: 無極{ 發射器: EventEmitter { 域名:空, _events:{}, _eventsCount:0, _maxListeners:未定義}, 發出:{}, 結束:虛假} –

0

那麼問題是它的一個異步調用所以在這種情況下你必須實現實現這一目標的承諾。

此外,如果你打算在模型中使用mongo對象ID,它是_id,那麼你應該去UserModel.findById(decodedToken.id)而不是UserModel.findOne({_id:decodedToken.id,}。它和下一次,當你想通過對象ID查詢集合只是去Model.findById它的一個很好的做法,希望它有幫助,

+0

謝謝,我真的很感激這個 –

+0

代碼我已經發佈一個代碼爲你檢查出來,並嘗試瞭解JavaScript承諾。什麼是承諾,以及它們如何工作。 –

0

好的按照這些步驟一個接一個我正在盡我所能來幫助你

首先,你需要安裝●庫來實現的諾言。您可以通過使用

npm install q安裝。

getUser(decodedToken.id).then(function(res){ 
    console.log(res); 
    var user = res; 
    //Just do it here what ever you want to do 
    },function(err){ 
    console.log(err) 
    }) 

    //Here is your promise that you going to return 
    function getUser(id) { 
    return Q.Promise(function(resolve, reject) { 
    UserModel.findById(decodedToken.id), function (err, user) { 
        if (err) return reject(err) 
        console.log('inside UserModel user = ', user) 
        resolve(user) 
       }); 
    }) 
    }