2015-05-02 56 views
0

我嘗試查詢當前登錄的用戶名並將該值設置爲Session。最後,這似乎是工作,但在瀏覽器控制檯,我得到以下異常: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 

這是我在這裏的拳頭的問題,我是一個新手流星。先謝謝你。

回答

0

你的幫手是在運行時你的用戶已經完全記錄您可以通過添加避免錯誤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. 它可以跨瀏覽器/機器工作 - 我假設你想跟蹤用戶在任何地方登錄,而不是跟蹤一個特定用戶使用同一瀏覽器再次登錄。
+0

感謝您的澄清和詳細的答案。我和你在一起。但是如果用戶已經註銷並且想要顯示歡迎信息,例如「歡迎回來,David!」,如果用戶重新打開該頁面,您將如何繼續。因爲Meteor是被動會話是實現這種功能的唯一方式。如果我錯了,請糾正我。 –

+0

我更新了答案,並提供了一個簡單的建議來解決這個問題。讓我知道,如果這是你在找什麼。 –

+0

正是我在找的東西。 Thankee!順便說一下,偉大的博客,許多有用的信息! –