【问题标题】:Set Session with usernames value使用用户名值设置会话
【发布时间】:2015-05-04 00:54:12
【问题描述】:

我尝试查询当前登录的用户名并将值设置为会话。最后,它似乎正在工作,但在浏览器控制台中我得到以下异常:Exception in template helper: TypeError: Cannot read property 'username' of undefined

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

这是我的第一个问题,我是 Meteor 新手。提前谢谢你。

【问题讨论】:

    标签: meteor coffeescript


    【解决方案1】:

    您的助手在您的用户完全登录之前运行。您可以通过添加guard 来避免错误,如下所示:

    Template.dashboard.helpers
      'setUsernameToSession': ->
        Session.set 'username', Meteor.user()?.username
    

    然而,你真的不应该首先这样做,因为助手应该没有副作用 - 请参阅common mistakes 的“过度工作的助手”部分。

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


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

    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()
    

    这应该是比使用会话变量更可靠的解决方案,因为:

    1. 会话变量在刷新或关闭浏览器后被清除。
    2. 它将跨浏览器/机器工作 - 我假设您想要跟踪用户在任何地方登录,而不是跟踪特定用户使用同一浏览器再次登录。

    【讨论】:

    • 感谢您的澄清和详细回答。我就在你身边。但是,如果用户已经注销并且您希望在用户重新打开页面时显示类似Welcome back, David! 的欢迎返回消息,您将如何继续。因为 Meteor 是响应式会话,所以实现这种功能的唯一方法。如果我错了,请纠正我。
    • 我用一个简单的建议更新了答案,说明了如何实现这一点。让我知道您是否正在寻找它。
    • 正是我想要的。谢谢!顺便说一句,很棒的博客,很多有用的信息!
    猜你喜欢
    • 1970-01-01
    • 2018-05-11
    • 2010-10-17
    • 2012-08-04
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多