nodejs / mongoose 更新文档中的“多级”值 / 无法设置属性
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
这是我的节点用户映射器中的更新功能:
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);
});
相关文章:
- Javascript使用变量设置属性
- 如何在自动完成时设置属性标题
- 未捕获的类型错误:无法设置属性'innerHTML'如果为null,则将脚本移动到正文不会;不起作用
- 未捕获的类型错误:无法设置属性'背景'的未定义
- 无法设置属性'innerHTML'在javascript中为null
- Haxe Javascript:在不使用Reflect的情况下按名称获取和设置属性
- Jquery为每个元素设置属性
- 从骨干集合筛选模型,然后为这些模型设置属性
- 我们可以设置属性'id'到不同的'按钮'通过使用javascript或jquery的循环
- 如何在javascript对象中设置属性的类型,就像mongoose模式设计一样
- emscripten+sdl=引发异常:TypeError:无法设置属性'widthNative'的未定
- 未捕获的类型错误:无法设置属性'onclick'为null.已尝试window.onload
- Backbone JS Promises在模型上设置属性之前解析
- Highcharts无法设置属性'的值;要点':对象为null或未定义
- 无法设置属性'round'的未定义
- 通过 Javascript 设置 C# 属性值
- 在 app.locals 上设置属性和调用 app.set() 有什么区别?
- 不引人注目地设置属性后函数失败
- j查询在设置属性后在后续单击时不读取数据属性
- IE错误:无法设置属性'的值;样式':对象为null或未定义