7

在使用(客户端)登录用户Meteor.loginWithPassword()或创建新用户后Accounts.createUser,我可以在他们的回调中确认Meteor.user()确实包含所有设置记录的属性。

{ _id: "XXX",
  profile: {
     name: "Joe Shmoe",
     thumbnail: "http://www.YYY.com/ZZZ.jpg"
  },
  username: "joeshmoe" }

此外,根据官方文档

默认情况下,当前用户的用户名、电子邮件和个人资料会发布到客户端。

那么,当我尝试访问我的模板中的这些字段时,任何人都能够说出为什么

Template.login.user_name = function () {
    return (Meteor.userId() ? Meteor.user().profile.name : '')
};

它失败是因为Meteor.user()只返回{_id: "XXX"}没有任何实际属性?即用户肯定已登录,但用户对象突然丢失/隐藏其所有属性。

有谁知道可能是什么问题?

非常感谢。

编辑: 这发生在 Meteor 0.5.4 上,这是撰写本文时的最新版本。接受的答案确实解决了这个问题;有时Meteor.userId()在对象的其余部分从服务器到达之前已经有效。谢谢大家。

4

3 回答 3

11

数据可能尚未从服务器到达。如果您检查属性,而不是只检查 Meteor.userId,会发生什么?

Template.login.user_name = function() {
  return Meteor.userId() && Meteor.user() && Meteor.user().profile ? Meteor.user().profile.name : "";
}
于 2013-01-09T18:42:29.193 回答
2

这也发生在我身上,使用 loginWithFacebook。我使用这个功能,到目前为止它没有问题:

var reallyLoggedIn = function() {
  var user = Meteor.user();
  if (!user) return false;
  else if (!user.profile) return false;
  else return true;
};
于 2013-01-10T05:37:13.373 回答
1

我无法重现这个问题,但如果你有用户 ID,你可以从完整的数据库 Meteor.users 中获取所有信息(即使它应该已经这样做了)。

Template.login.user_name = function() {
    return (Meteor.userId() ? Meteor.users.findOne({_id:Meteor.userId()}).profile.name : '')
}
于 2013-01-09T19:02:35.327 回答