Где определить 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, обновление, удаление) реализованы как методы. (...)
Отдельный раздел, объясняющий использование заглушек на клиенте, может облегчить понимание вызовов методов на сервере.