我使用accounts-vk通过vkontakte.ru提供登录 在我删除meteor-autopublish包之前,一切正常。 我的connectSubmit.js:
Template.connectSubmit.events({
'submit form': function(e) {
e.preventDefault();
var query = {
vk_id: Meteor.user().services.vk.id,
user_id: Meteor.userId(),
photo: Meteor.user().services.vk.photo
};
query._id = Connects.insert(query);
Router.go('index');
}
});
错误是:
Uncaught TypeError: Cannot read property 'vk' of undefined
我的模板的第二个问题: 在我删除自动发布之前,这很有效:
{{currentUser.services.vk.first_name}}
但现在不行。 我认为Meteor.publish功能存在问题,但我不知道如何解决它。
答案 0 :(得分:2)
启用autopublish
后,它会发布用户所有字段的全部。删除autopublish
时,只会发布一些字段(用户名,_id,电子邮件,个人资料)。
如果您发布services
字段,则会向客户端公开登录令牌和散列密码等内容。显然,你永远不想在生产中这样做(这就是为什么autopublish
应该总是被删除的原因)。有关这方面的更多信息,请参阅"已发布的秘密"我common mistakes文章的一部分。
因此,对您的问题的简短回答是,客户首先不应该做这些事情。
答案很长,如果你有需要这些数据的逻辑,你需要做两件事之一(这可能需要单独的问题):
如果只需要服务信息进行数据突变
在这种情况下使用服务器端方法。在submit
事件中,您可以调用一个方法,对当前用户执行findOne
并更新Connects
集合。在这里读取services
数据是安全的,因为代码在服务器上运行。
如果客户端需要服务信息(例如照片)
您需要将services
中的数据复制到profile
这样的安全字段中。您可以在用户creates her account或每当logs in时执行此操作。