Я неправильно понял сессию, что является хорошей альтернативой?

#meteor

#метеор

Вопрос:

В настоящее время я создаю приложение с помощью meteor, изучая его во время сборки. Я пытаюсь включить сеансы вместо того, чтобы записывать все в базу данных (что я делал). В моем понимании сеанс — это глобальный объект, который хранит пары ключ-значение и является реактивным. Поэтому я подумал, что это будет отличным выбором для использования для специфики рендеринга шаблонов в моей простой игре. Моя цель — небольшая игра, и разные шаги будут отображаться в шаблоне для каждого игрока на основе определенного действия, которое они совершили.

Я переписал свое приложение и хотел использовать Session таким образом (упрощенный, конечно).

Мой шаблон:

 <template name="gameRoom">

  <button id='click'>click</button>

  {{#if lastAction}}
    {{>waiting}}
  {{/if}}
</template>



Template.gameRoom.events({
      lastAction: function() {
       return Session.get('lastAction') === Meteor.userId();
    };   
})

Template.gameRoom.helpers({
      'click #click' : function() {
        Session.set('lastAction', Meteor.userId());
    };
})
  

Однако это работает не так, как я думал, что это сработает. Похоже, что каждый сеанс индивидуален для каждого пользователя (что имеет смысл, конечно, учитывая, что это (своего рода) замена файлов cookie).

Итак, мой вопрос:

  • Есть ли хорошая альтернатива для сеансов? Мне действительно нужна альтернатива или для этого используется база данных? Как насчет локальной базы данных?

Ответ №1:

Ваши events helpers функции и выполнены в обратном направлении, вам не хватает пары фигурных скобок, а ваш ключ события (идентификатор кнопки) неверен. Попробуйте это:

 Template.gameRoom.helpers({
  lastAction: function() {
    return Session.equals('lastAction', Meteor.userId());
  }
});

Template.gameRoom.events({
  'click #click': function() {
    Session.set('lastAction', Meteor.userId());
  }
});
  

Редактировать: из того, что вы пытаетесь сделать, может иметь смысл сделать что-то вроде этого:

 Actions = new Meteor.Collection('actions');

if (Meteor.isClient) {
  Template.gameRoom.events({
    'click #click': function() {
      Actions.insert({userId: Meteor.userId()});
    }
  });

  Template.gameRoom.helpers({
    lastAction: function() {
      var lastAction = Actions.findOne() || {};
      return lastAction.userId === Meteor.userId();
    }
  });
}
  

Комментарии:

1. Спасибо, я не знал о сеансе. равно пока :). Однако, возможно, я неправильно понимаю ваш комментарий. Но моя цель такова: если один пользователь нажмет кнопку, шаблон будет показан ТОЛЬКО этому пользователю. Но я думаю, что Session — это неправильный инструмент, поэтому я спросил, какая лучшая альтернатива для этого.

2. Для этого вы можете использовать базу данных. Смотрите мое редактирование. Обратите внимание, что вам все равно нужно добавить разрешающее правило для insert , которое запрещает пользователям выполнять 2 действия подряд.

3. Спасибо. Было немного грязно писать об использовании базы данных для этого. Спасибо, что прояснили это 🙂