2017-06-11 68 views
0

我正在嘗試檢查用戶帳戶是否已在用戶模型或TempUser模型中創建,但是遇到問題,我無法將找到的值添加到對象以處理條件檢查。無法將屬性添加到對象 - Node.js/Mongoose

請檢查下面的代碼和註釋:

exports.isRegistered = function(userModel, tempUserModel, username){ 
    var obj = {}; //creating an empty object to add the found results later 
    userModel.findOne({username: username}, function(err, user){ 
     if(err) throw err; 
     if(user){ 
      obj.user = user; 
      console.log(obj); // doesn't fire as no user was found found 
     }else{ 
      tempUserModel.findOne({username: username}, function(err, tempUser){ 
       if(err) throw err; 
       obj.tempUser = tempUser; 
       console.log(obj); // returns object with a tempUser as it was found 
      }); 
     } 
    }); 
    console.log(obj); //returns an empty object again. 
}; 

回答

1

看到代碼,你的問題後,我可以來這些結論:

,因爲沒有用戶發現不火發現

您確定您User集合具有給定用戶名的這些對象嗎?我不這麼認爲。請檢查您是否提供了username的正確值,並且具有該值的用戶集合中存在文檔。

再次返回空對象。

回調總是有點棘手的理解。 好了,讓我們打破你在你的代碼做的步驟:

  1. 聲明obj,作爲空對象
  2. 在模型
  3. 登錄obj,這表明您{},即空白對象調用findOne

它發生是因爲第二步跑異步。 這是你的代碼是如何流出,

申報OBJ - >調用FineOne(但仍沒有執行回調) - >已記錄的OBJ(尚爲空白) - >執行FineOne操作的回調並填充一些值的OBJ

我希望現在更清楚一點。我建議你閱讀這些博客:

讓我在任何澄清的情況下。 謝謝!

+0

感謝您的澄清和參考,將嘗試更好地理解一切。 –

1

你得到一個空對象,因爲這兩個查詢是異步的。爲了使用找到的參數返回適當的對象,您可以在查詢範圍內返回它。你可以使用Promise來實現這一點。

我將建立一個通用的功能對兩個集合執行查找:

exports.isRegistered = (userModel, tempUserModel, username) => { 
    let usr = {}; 
    findUser(username, userModel).then((user) => { 
     if(user) { 
      usr.user = user; 
      return usr; 
     } 
     findUser(username, tempUserModel).then((user) => { 
     if(user) { 
      usr.tempUser = user; 
      return usr; 
     } 
     return ({error : 'User Not Found'}); 
     }).catch((err) => { 
      return err; 
     }); 
    }).catch((err) => { 
     return err; 
    }); 
} 

const findUser = (username, collection) => { 
    return new Promise((resolve, reject) => { 
     collection.findOne({username : username}).then((err, user) => { 
     if(err) return reject(err); 
     if(user) return resolve(user); 
     }); 
    }); 
} 

你也可以把兩種調用數組內,解決他們與加入他們的結果,這樣你就可以更快地執行它們。