3

我创建了一个流星 0.5.4 应用程序 - 添加了帐户 UI、帐户密码,并将 {{loginButtons}} 添加到模板 name="hello" 块帽子随每个流星创建一起提供。

当我在 chrome 浏览器控制台中输入这个时, Meteor.user().emails[0].address 根据这些 SO 来源 - http://goo.gl/MTQWuhttp://goo.gl/Cnbn7 - 我得到当前登录的用户电子邮件。

当我尝试将相同的代码放入 if (Meteor.isClient) 部分时:

Template.hello.greeting = function () {
   return Meteor.user().emails[0].address;
};

我得到:

 Uncaught TypeError: Cannot read property '0' of undefined foo.js:3
 Exception from Meteor.flush: TypeError: Cannot call method 'firstNode' of undefined

如果您不能将 Meteor.user() 放在发布功能中,我还能如何获取登录用户的电子邮件?我尝试将其设为共享函数,并在客户端函数中使用 Meteor.call('getEmail', Meteor.userId()) 调用它,结果相似。

4

1 回答 1

9

模板是反应式的。这意味着当页面加载时,模板会运行,当其依赖的数据源发生变化时,它会再次运行。在您的情况下,它第一次运行时还Meteor.user()没有准备好,所以它还没有emails属性,这会导致错误。要解决此问题,您需要检查用户对象是否存在:

Template.hello.greeting = function() {
  var user = Meteor.user();
  if (user && user.emails)
    return user.emails[0].address;
}

要在发布函数中获取当前用户,请使用this.userId.

于 2013-01-15T20:48:59.517 回答