流星提交表单:未捕获类型错误:无法读取属性' vk'未定义的

时间:2015-04-02 19:02:30

标签: meteor handlebars.js

我使用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功能存在问题,但我不知道如何解决它。

1 个答案:

答案 0 :(得分:2)

启用autopublish后,它会发布用户所有字段的全部。删除autopublish时,只会发布一些字段(用户名,_id,电子邮件,个人资料)。

如果您发布services字段,则会向客户端公开登录令牌和散列密码等内容。显然,你永远不想在生产中这样做(这就是为什么autopublish应该总是被删除的原因)。有关这方面的更多信息,请参阅"已发布的秘密"我common mistakes文章的一部分。

因此,对您的问题的简短回答是,客户首先不应该做这些事情。

答案很长,如果你有需要这些数据的逻辑,你需要做两件事之一(这可能需要单独的问题):

如果只需要服务信息进行数据突变

在这种情况下使用服务器端方法。在submit事件中,您可以调用一个方法,对当前用户执行findOne并更新Connects集合。在这里读取services数据是安全的,因为代码在服务器上运行。

如果客户端需要服务信息(例如照片)

您需要将services中的数据复制到profile这样的安全字段中。您可以在用户creates her account或每当logs in时执行此操作。