Подтвердить что ты не робот

Когда использовать Meteor.methods и использовать заглушки

Используя Meteor, я пытаюсь понять, когда использовать серверную сторону Meteor.methods(), сохраняя при этом мгновенные обновления пользовательского интерфейса.

Из Andrew Scala вводное учебное пособие, он утверждает, что Meteor.methods() следует использовать, когда вы хотите обновлять и изменять ваши документы базы данных:

Идея состоит в том, что вы определяете все функции на сервере, которые делают опасные вещи, такие как изменение и обновление данных, а затем позволить клиенту вызывать эти функции и получать возвращаемые значения, такие как обычные функции. клиент никогда не видит реализацию и лично не модифицирует данные. Сервер выполняет всю работу.

И после этого совета я реализовал это в своем коде:

Серверная сторона:

Meteor.methods({

  addMovie: function(data) {
    var movie = Movies.insert({name: data});
    return movie;
  },

  ...

Клиентская сторона:

Template.movies.events = ({

  'click #add-movie': function(e) {

    var name = document.getElementById('movie-name').value;
    Meteor.call('addMovie', name);

    return false;

  }, 

  ...

Это работает, но оно медленное. Пользовательский интерфейс не обновляется мгновенно, как если бы вы набрали Movies.insert() на стороне клиента. docs показывают, что для исправления проблемы вы можете создавать заглушки на стороне клиента:

Методы вызова на клиенте определяют функции заглушки, связанные с серверные методы с тем же именем. Вам не нужно определять заглушку для ваш метод, если вы этого не хотите. В этом случае вызовы методов просто например, удаленные вызовы процедур в других системах, и вам придется подождать для результатов с сервера.

Но какими должны быть эти заглушки? Должен ли он в основном выглядеть так же, как на стороне сервера? Если да, то какой смысл? Я ищу более подробное объяснение использования и назначения Meteor.methods(), точки/использования заглушек и их реализации.

EDIT: Дэвид Гринспен помог уточнить использование Meteor.methods() и заглушек на meteor-talk.

4b9b3361

Ответ 1

вот еще один пример.

скажите, что вы пишете игру в бинго, и вы нажимаете кнопку, чтобы вызвать "дом!".. в событии клика вы можете вызвать метод, например

Method.call("callHouse");

это вызовет метод сервера:

// on the server
Meteor.methods({
  callHouse: function () {
    if (currentGame.isInProgress) {
      currentGame.winner = this.userId;
      currentGame.end();
    }
  }
});

если вы первым позвоните в "дом", метод будет отмечать вас как победителя. Однако пусть притворяется, что метод очень медленный, и ваше клиентское приложение ждет.. вы на 99% уверены, что сервер будет подтвердите, что вы победитель - вы просто хотите обновить экран пользователя без ожидания.. в этом случае реализовать клиентскую заглушку:

// on the client
Meteor.methods({
  callHouse: function () {
    currentGame.winner = Meteor.userId();
    // add any other side-effects you expect to occur here
  }
});

когда возвращается результат сервера, если возвращаемые данные отличаются от того, что вы установили в заглушке, он исправит его и соответствующим образом обновит экран.

Ответ 2

Короче:

Определите некоторые методы (Meteor.methods) в файлах, помещенных в сегмент, которые будут выполнять фактическую работу на сервере, определите некоторые методы (Meteor.methods) в файлах, нажимаемых клиенту, чтобы получить "мгновенное" поведение на клиент (например, индикатор загрузки), пока сервер не подталкивает полученные изменения обратно клиенту

Здесь Дэвид оригинал сообщения:

Привет, Бен,

В принципе, метод может выполнять совершенно разные действия на клиент и сервер, например, отображающий индикатор загрузки на клиент и разговаривать с удаленным API на сервере. Звонки на Meteor.methods на клиенте определяют поведение клиента и звонки Meteor.methods на сервере определяют поведение сервера.

Для методов, которые работают в базе данных, часто одни и те же реализация будет выполнена для обоих. Версия клиента влияет на база данных на стороне клиента ( "кеш" на стороне браузера подписанных документов to), а серверная версия влияет на реальную базу данных. Когда клиент слышит, он "привязывается" к результату серверной стороны мутации; мутации базы данных на стороне клиента отбрасываются (или отменить, в зависимости от того, как вы думаете об этом). Если клиентский метод вызывает другие методы, эти вторичные вызовы не удаляются сервер. Серверная версия будет либо вызывать те же методы на сервер, или нет, по своему усмотрению.

Таким образом, любой клиентский метод, который вы предоставляете, представляет собой просто "симуляцию" и не может быть точной (возможно, она не может быть). Надежда что вы, как правило, получаете бесплатный имитатор моделирования, потому что он так же, как сервер impl!

Отвечает ли это на ваш вопрос?

- Дэвид

Ответ 3

Если вы определяете метод в файле, совместно используемом клиентом/сервером типа /collections, не будет ли он доступен для обоих и автоматически заглушить?

Итак:

/collections/houses.js

Meteor.methods({
  callHouse: function () {
    if (currentGame.isInProgress) {
      currentGame.winner = this.userId;
      currentGame.end();
    }
  }
});

Это будет доступно как для клиента, так и для сервера. Если он не пройдет, сервер автоматически отклонит обновление клиента/вернет его.

Ответ 4

Как сказал Даниэль, вы можете определить метод в файле, который не находится в клиентских или серверных каталогах и доступен с обеих сторон. Вы также можете использовать значение isSimulation boolean для дополнительной проверки. Например, это может выглядеть примерно так:

Meteor.methods({
  addMovie: function (movieData) {
    if (!this.isSimulation) {
      check(movieData, someAdditionaCheckinFunc);
    }
    Movies.insert(movieData);
  }
})

Таким образом, код в условной ветке будет выполняться только на сервере.