Meteor 使用用户名值设置会话

Meteor 使用用户名值设置会话,meteor,coffeescript,Meteor,Coffeescript,我尝试查询当前登录的用户名,并将该值设置为会话。最后,它似乎在工作,但在浏览器控制台中我得到以下异常:模板帮助程序中的异常:TypeError:无法读取未定义的属性“username” Template.dashboard.helpers 'setUsernameToSession': -> user = Meteor.users.findOne(Meteor.userId()) Session.set 'username', user.username 这是我的第一

我尝试查询当前登录的用户名,并将该值设置为会话。最后,它似乎在工作,但在浏览器控制台中我得到以下异常:
模板帮助程序中的异常:TypeError:无法读取未定义的属性“username”

Template.dashboard.helpers
  'setUsernameToSession': ->
    user = Meteor.users.findOne(Meteor.userId())
    Session.set 'username', user.username

这是我的第一个问题,我是一个流星新手。提前感谢您。

在用户完全登录之前,您的助手正在运行。您可以通过添加类似于这样的选项来避免错误:

然而,你真的不应该一开始就这样做,因为帮手应该是没有副作用的——请参阅本手册的“过度工作的帮手”一节

相反,您可以在代码中需要用户名的任何地方使用
Meteor.user()?.username
,在模板中,您可以使用
{{currentUser.username}
,而无需帮助。这两个示例都是被动的,因此不需要
会话
变量


在您的特定情况下,您希望在用户登录时提醒她。一种方法是使用一个可以放置在
客户机
目录中任何位置的:

Tracker.autorun (c) ->
  # extract the username
  username = Meteor.user()?.username
  if username
    # replace this with something better
    console.log "Welcome back #{username}!"
    # stop the autorun
    c.stop()
这应该是比使用会话变量更可靠的解决方案,因为:

  • 会话变量在刷新时或关闭浏览器后被擦除
  • 它可以跨浏览器/机器工作——我假设您希望跟踪用户在任何地方登录,而不是跟踪某个特定用户使用同一浏览器再次登录

  • 感谢您的澄清和详细回答。我就在你身边。但是,如果用户已经注销,您希望显示一条欢迎回来的消息,如
    欢迎回来,David如果用户重新打开页面。因为Meteor是被动的,所以会话是实现这种功能的唯一方法。如果我错了,请纠正我。我用一个简单的建议更新了答案。让我知道这是否是你要找的。正是我要找的。谢谢!顺便说一句,很棒的博客,很多有用的信息!
    
    Tracker.autorun (c) ->
      # extract the username
      username = Meteor.user()?.username
      if username
        # replace this with something better
        console.log "Welcome back #{username}!"
        # stop the autorun
        c.stop()