Meteor - метод вызова из метода клиента и сервера

Что произойдет, если из метода, который используется совместно клиентом и сервером, я вызову другой метод, который находится только на сервере? Будет ли он вызываться дважды? Только один раз с сервера? Только один раз от клиента?

//lib/methods.js
Meteor.methods({
  test: function() {
    /*do some stuff that needs to update the UI quickly*/
    Meteor.call('doSomeSecureStuff', Meteor.isClient);
  }
});

//server/methods.js
import secureStuff from './secureStuff.js';
Meteor.methods({
  doSomeSecureStuff: function(originIsClient) {
    console.log(originIsClient);
    secureStuff();
  }
});

Из моих тестов он вызывается с сервера только один раз, но, поскольку я не нашел документа по этому поводу, я хотел убедиться, что 1) это то, что происходит на самом деле, и 2) останется таким в будущем

(Как следует из примера, вариант использования, для которого я не могу просто обернуть серверную часть в Meteor.isServer, — это когда мне нужно загрузить код, доступный только на сервере)


person Guig    schedule 10.03.2016    source источник
comment
Методы только на стороне сервера. они не работают на клиенте. клиент вызывает метод сервера   -  person MrE    schedule 10.03.2016
comment
Это неправда: методы выполняются на клиенте, а также симуляция, чтобы обеспечить более быстрое обновление пользовательского интерфейса, а когда приходит ответ от сервера, результаты сравниваются и при необходимости обновляются в соответствии с сервером. docs.meteor.com/#/full/meteor_methods   -  person Guig    schedule 10.03.2016
comment
Это верно только в том случае, если вы явно определяете свои методы для сервера либо в /server/, либо в if (Meteor.isServer) { ... }.   -  person Guig    schedule 10.03.2016


Ответы (1)


Да, только один раз на сервере.

Вы можете обернуть серверную часть общего метода с помощью this.isSimulation

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

person sys13    schedule 10.03.2016
comment
Да, мне было интересно, насколько ограничена симуляция (может ли она изменить пользовательский интерфейс, который ответ сервера не сможет исправить? Здесь: может ли она вызывать другие методы? Может ли она вызывать внешние скрипты, такие как метрики регистрации и т. д.?) - person Guig; 10.03.2016
comment
Ответ сервера обновляет только состояние minimongo (кэш mongo в клиенте). Не уверен насчет вызовов внешних скриптов. - person sys13; 10.03.2016
comment
Я только что проверил: если вы делаете if (Meteor.isClient) {$.get('https://test.com/');} в своем методе, запрос выполняется, поэтому непонятно, почему Meteor.call не запускается с клиента (даже если это имеет смысл, потому что метод запускается с обеих сторон, вы не могли бы исключить его эффект умножить) - person Guig; 10.03.2016