登录后Meteor.user()未完全加载

时间:2014-07-16 12:37:36

标签: meteor field accounts

我正在使用Meteor 0.8.2和accounts-facebook。我以这种方式为用户设置了一个有限的出版物:

Meteor.publish('users', function () {
  return Meteor.users.find({}, {fields: {'profile.picture': 1, 'profile.gender':1, 'profile.type':1}, sort: {'profile.likes': -1}});
});

现在这很有效:当我从客户端请求用户列表时,我得到所有用户的列表,其中显示当前用户的所有字段,并且仅显示其他用户的3个已发布字段。 登录后立即

当我登录并输入Meteor.user()时,我得到的是:

_id: "uACx6sTiHSc4j4khk"
profile: Object { gender="male", type="1", picture="http://....jpg"}

这一直保持不变,直到我使用浏览器按钮刷新页面。刷新后,Meteor.user()会提供所有可用字段,而Meteor.users.find()仍会提供正确的限制。 (当然除了当前用户)

为什么我当前的用户不能立即获取所有字段?我读到了用于等待用户加载的Meteor.userLoaded()方法,但在最新版本中它似乎已经过时了。

2 个答案:

答案 0 :(得分:5)

您正在遇到跨发布的合并字段限制与发送profile字段的默认用户发布之间的交互。

首先,请注意,内置的发布始终会将当前登录用户的整个profile字段发送给该用户:

  

https://github.com/meteor/meteor/blob/devel/packages/accounts-base/accounts_server.js#L1172

其次,目前不支持在多个级别深度合并字段:

  

https://github.com/meteor/meteor/issues/998

您目前所拥有的是默认出版物发送类似以下内容的问题

{
  username: ...,
  emails: [ ... ],
  profile: { 
    ... all fields ... 
  }
}

而您设置的出版物正在发送

{
  profile: {
    picture: ...
    gender: ...
    type: ...
  }
}

根据订阅解析规则(http://docs.meteor.com/#meteor_subscribe)将这些内容合并到客户端。特别是,请参阅最后一段。 Meteor知道将usernameemail字段与profile字段合并。但是,它并没有在内部层面进行合并。因此,profile字段中的一个将被任意选择以显示在客户端的集合中。如果第一个获胜,您将看到profile.likes。如果第二个获胜,你就不会。

这种行为可能在某种程度上是确定性的,并且会根据是否调用普通登录处理程序或恢复处理程序(即重新加载浏览器时)而发生变化。因此,为什么它看起来没有加载。

答案 1 :(得分:2)

正如Andrew所解释的那样,正如我所想的那样,当前用户还有另一个“隐藏”的出版物与我的冲突。为了解决这个问题,我所要做的只是将当前用户从我的出版物中排除,因为默认情况下它已经完全发布:

Meteor.publish('users', function () {
  return Meteor.users.find({_id:{$ne: this.userId}}, {fields: {'profile.picture': 1, 'profile.gender':1, 'profile.type':1}, sort: {'profile.likes': -1}});
});

这个简单的$ ne为我做了。