Пишу приложение, состоящее из двух модулей - клиентского и серверного. Сервер публикует набор записей и функцию, клиент подписывается на набор записей и вызывает удаленные функции. Оба модуля работают на стороне сервера. Все работает как положено до переподключения сеанса 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);
}
Итак, вопрос: что вызывает такое поведение?