我已经尝试过寻找答案,但似乎无法让这个工作。我正在使用Meteor和Cordova构建移动应用。
我想在我的Users集合中添加一个属性(Meteor在我登录时创建的属性)。即。例如,我想将{currentHotel:" Something"}添加到我的db.Users集合中。
我试图以正确的发布 - 订阅方式执行此操作。使用Meteor.methods被引用对实时应用程序不利。无论哪种方式,我想了解如何使用Publish - Subscribe。来更新Users集合。
//On the server, I did
Meteor.publish("userData", function () {
return Meteor.users.find({_id: this.userId},
{fields:{services: 1, currentHotel: 1}});
});
因此客户端应该可以访问currentHotel字段。现在更新" currentHotel"字段:
//On the client I do
Meteor.subscribe('userData');
var user = Meteor.users.findOne({"_id": Meteor.userId()});
Meteor.users.update({_id: user._id}, {$set:{currentHotel:'something'}});
//I tried this too
//Meteor.users.update({ _id: Meteor.userId() }, {$set: });
在浏览器控制台上,我可以看到" currentHotel"和"服务"很好,这意味着发布 - 订阅工作。但我似乎无法更新currentHotel。我得到一个拒绝访问。这是为什么?
此外,如果" currentHotel" Collection中根本不存在属性,如何使用类似的发布 - 订阅添加它?我是否可以发布不存在的属性并允许客户订阅并添加该属性?
我提到了Meteor文档,this,this和this,但似乎无法让它发挥作用! : - (
提前致谢!
答案 0 :(得分:7)
您不应该更改用户对象的根域:
Meteor.users.update(user, {$set: {"profile.currentHotel": "something"}});
在此处阅读更多内容:http://docs.meteor.com/#/full/meteor_users
编辑:这个答案变得无关紧要,如最新文档所示:https://guide.meteor.com/accounts.html#dont-use-profile
这个答案超过1岁:)事实证明,强迫在“个人资料”字段下编写用户特定字段作为一些严重的安全隐患(我一直认为),因为它允许客户端修改这些子字段。所以是的,你可以在根对象中设置字段,但要注意客户端不应该修改的字段应该在没有写权限的字段下(否则它会遇到同样的问题)。