2014-10-05 3 views
0

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

Мне удалось найти две операции, которые использовали одновременно, чтобы вызвать этот эффект. Его «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); 
} 

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

ответ

0

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

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); 
    }); 
}); 

Вы должны также (возможно) видели некоторую отладочную/полезную информацию о нем в серверной консоли

+0

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

+0

@ user4110474 А я вижу. К сожалению, я не думаю, что знаю, что происходит в этом случае. – Akshat