Метеор - прервана связь после переподключения ddp

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

Мне удалось найти две операции, которые одновременно вызывали этот эффект. Его «self.ready ()» и вызов любой удаленной функции внутри обработчика повторного подключения. Если я уберу что-то из этого, все вернется на круги своя.

Сервер:

if (Meteor.isServer) {
  Meteor.publish("pname", function () {
    var self = this;
    var id = Random.id();
    self.added("pname", id, {"init": "demo"});
    self.ready();
    Meteor.setInterval(function(){
      var id = Random.id();
      self.added("pname", id, {"init": "test"});
      self.removed("pname", id);
    }, 2000);
  });
  Meteor.methods({
    'demo': function (){
      console.log('demo function called');
      return 'demo';
    }
  });
}

Клиент:

if (Meteor.isServer) {
  var remote = DDP.connect("http://example.com:3000");
  remote.onReconnect = function() {
    console.log('reconnect');
    console.log('calling remote function inside reconnect');
    var temp = remote.call('demo');
    console.log(temp);
  };
  var collection = new Meteor.Collection("pname", remote);
  collection.find({}).observe({
    "added": function(item) {
      console.log('added', item);
    }
  });
  remote.subscribe("pname");
  Meteor.setInterval(function(){
    console.log('calling remote function');
    var temp = remote.call('demo');
    console.log('Result: ' + temp); //after reconnect this line is not called
  }, 2000);
}

Итак, вопрос: что вызывает такое поведение?


person user4110474    schedule 05.10.2014    source источник


Ответы (1)


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

Meteor.publish("pname", function () {
    var self = this;
    var id = Random.id();
    self.added("pname", id, {"init": "demo"});
    self.ready();
    var intervalid = Meteor.setInterval(function(){
        var id = Random.id();
        self.added("pname", id, {"init": "test"});
        self.removed("pname", id);
    }, 2000);

    self.onStop(function() {
        Meteor.clearInterval(intervalid);
    });
});

Вы также должны были (возможно) увидеть некоторую отладочную/полезную информацию об этом в консоли вашего сервера.

person Tarang    schedule 05.10.2014
comment
Я не понимаю, я написал, что мы можем имитировать отключение, перезагрузив (остановить / запустить) серверный модуль, чтобы он не знал о каких-либо предыдущих подписках. Когда я добавляю self.onStop(function() { console.log('onStop publish'); }); затем при сбросе клиентского модуля я вижу, что он перестает публиковаться. - person user4110474; 05.10.2014
comment
@ user4110474 А, понятно. К сожалению, я не думаю, что знаю, что происходит в этом случае. - person Tarang; 05.10.2014