Где определить Meteor.methods()?

http://docs.meteor.com/#meteor_methods

Я пробовал его в файле publish.js в папке моего сервера.

Я успешно вызываю Meteor.apply и пытаюсь позвонить серверу с клиента. Я всегда получаю ответ undefined.

Ответы

Ответ 1

Вызов Meteor.methods на сервере правильный. Это определит удаленные методы, которые запускаются в привилегированной среде и возвращают результаты клиенту. Чтобы вернуть нормальный результат, просто вызовите return из вашей функции метода с некоторым значением JSON. Чтобы подать сигнал об ошибке, введите Meteor.Error.

На клиенте Meteor.apply всегда возвращает undefined, потому что вызов метода асинхронен. Если вы хотите получить возвращаемое значение метода, последним аргументом для apply должен быть обратный вызов, которому будут переданы два аргумента: error и result в типичном стиле обратного вызова асинхронного вызова.

Является ли ваш код сервера фактически вызванным? Вы можете проверить это, обновив БД в методе и посмотрев, получает ли кеш клиента новые данные или вызывает console.log внутри тела метода и смотрит на результат процесса "метеор" в вашем терминале.

Ответ 2

Есть несколько мест, где я могу определить my Meteor.methods() (с pro и con):

  • Только на сервере - когда клиент вызывает этот метод, ему придется ждать ответа сервера, прежде чем что-либо изменится на стороне клиента
  • На сервере и использует заглушку на клиенте - когда клиент вызывает этот метод, он будет выполнять метод заглушки на стороне клиента, который может быстро вернуть (прогнозируемый) ответ, Когда сервер возвращается с "фактическим" ответом, он заменит ответ, сгенерированный заглушкой, и обновит остальные элементы согласно.
  • Тот же метод на клиенте и сервере - обычно используется для методов, связанных с коллекциями, где метод на самом деле является заглушкой на стороне клиента, но этот заглушка такой же, и использует клиентские кэшированные коллекции, а не сервер. Таким образом, он все равно будет обновляться мгновенно, как и заглушка, но я думаю, это немного более точно в его угадывании.

Ответ 3

Я привел здесь короткий пример, если вам нужен рабочий пример: https://gist.github.com/2387816

Ответ 4

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

Использование Meteor.methods() на клиенте тоже полезно. (ищите "заглушку" в разделе Meteor.call()...) Это позволяет клиенту (синхронно) имитировать ожидаемый эффект вызова сервера. Как упоминалось в документах:

Вы используете методы все время, потому что мутаторы базы данных (insert, обновление, удаление) реализованы как методы. (...)

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