簡體   English   中英

nodejs /貓鼬更新文檔中的“多級”值/無法設置屬性

[英]nodejs / mongoose update a “multi level” value in document / cannot set property

我有一個“用戶”集合,其中包含一些字段(名稱,名字,登錄名,密碼...)

我想將用戶名和密碼存儲在名為“ local”的“子文檔”中(對於本地連接,將來我可以有一個名為“ facebook”或“ google”的子文檔...)

因此,這是mongo中文檔的結構:

db.User.find(){
    "__v": 0,
    "_id": ObjectId("5342b25940bcab2d1d71e04a"),
    "active": true,
    "address": "juddegaass, 2A",
    "api_key": "3cead67add74395ce4d1dfcdd3ea4979",
    "city": "Kehlen",
    "country": "LU",
    "create_date": ISODate("2014-04-07T14:12:41.104Z"),
    "credit": 0,
    "email": "admin@company.com",
    "firstname": "Admin",
    "lastname": "Istrator",
    "local": {
        "email": "admin@company.com",
        "password": "$2a$08$Y7GorE3UhceNhPzvAdv7X.wDNxp80snHdng0hq9r1AePqRW1iHU5i"
    },
    "role": "su",
    "uptade_date": ISODate("2014-04-07T14:12:41.104Z"),
    "zip": "8281"
}

我有一個更新用戶的表單,而我的問題是提交此表單時。 我有一個錯誤:

TypeError: Cannot set property 'email' of undefined

這是我的Node User Mapper中的更新功能:

var toUpdate = {};

if (data.firstname) toUpdate.firstname = data.firstname;
if (data.lastname) toUpdate.lastname = data.lastname;
if (data.email) {
    toUpdate.email = data.email; 
    toUpdate.local.email = data.email;
}
if (data.password !== '') toUpdate.local.password = user.generateHash(data.password);
if (data.role) toUpdate.role = data.role;
...
if (data.apiKey) toUpdate.api_key = data.apiKey;
if (data.active) toUpdate.active = data.active;

dbUser.update({'_id' : data.id}, toUpdate, {upsert : true}, function (err) { 
    if (err) return callback(new Error(err));
    callback(null, data.id);
});

當然,我可以聲明“本地”子對象,但是如果聲明了它,密碼值將被刪除。

您的評論清楚表明您可能已經在數據庫中為此項目添加了一個條目。 當您使用貓鼬時,正確的更新方法是先將其從數據庫中拉出,然后保存。

dbUser.findbyId(data.id, function(err, user){
  if(err){
    return callback(err);
  }
  if(!user){
    user = new dbUser();
  }
  if (data.firstname) user.firstname = data.firstname;
  //...//
  if(data.email){
     user.local = user.local || {}; 
     user.local.email = data.email;
  }
  if(data.password !== '') {
    user.local = user.local || {}; 
    user.local.password = dbUser.generateHash(data.password);
  }
  user.save(callback); 
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM