2015-05-02 3 views
0

Я пытаюсь запросить текущее имя пользователя, которое входит в систему, и установить значение для сеанса. И, наконец, это, кажется, работает, но в браузерах консоли я получаю следующее исключение: Exception in template helper: TypeError: Cannot read property 'username' of undefinedУстановить сеанс с именем usernames

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

Спасибо за разъяснение и подробный ответ. Я прямо здесь с тобой. Но как вы продвигаетесь, если пользователь уже вышел из системы, и вы хотите отобразить приветственное сообщение, например «Добро пожаловать обратно, Дэвид!», Если пользователь снова откроет страницу. Поскольку Meteor является реактивной сессией, это единственный способ реализовать такую ​​функцию. Пожалуйста, поправьте меня, если я ошибаюсь. –

+0

Я обновил ответ простым предложением о том, как это сделать. Дайте мне знать, если это то, что вы ищете. –

+0

Именно то, что я искал. Благодарю! Отличный блог, кстати, много полезной информации! –

Смежные вопросы