我最近从1.2升级到Meteors最新版本1.6.0.1。
我在发布中使用了观察并在客户端上进行了观察以获得更改。
在1.2中没有任何问题,但是在“已更改”的客户端回调中没有收到1.6观察到的更改,但客户端确实收到了ddp消息。我可以通过查看Chromes dev工具>来验证这一点。 websocket,查看传入消息,但它永远不会在客户端回调中触发。这仅在一次更改2-3个文档时发生。因此,当我从数据库中删除一些文档时,发布会触发回调,客户端会在websocket消息中接收它们,但它只会在客户端的“观察”回调中触发一次。
这是我的代码。
客户 -
CollectionTest = new Meteor.Collection('collectionTest');
CollectionTest.find({}).observe({
added: function (doc) {
console.log("ADDED DOC ", doc);
},
changed: function (newDoc, oldDoc) {
console.log("CHANGED DOC new ", newDoc);
},
removed: function (doc) {
console.log("REMOVED DOC ", doc);
}
});
服务器发布 -
Meteor.publish("ddpPub", function () {
var self = this,
ready = false;
var userId = self.userId;
var subHandle = TestData.find({}).observeChanges({
added: function (id, fields) {
if (ready) {
self.changed("collectionTest", userId, {
type: "added",
data: {
id: id,
fields: fields
}
});
}
},
changed: function (id, fields) {
if (ready) {
self.changed("collectionTest", userId, {
type: "changed",
data: {
id: id,
fields: fields
}
});
}
},
removed: function (id) {
if (ready) {
self.changed("collectionTest", userId, {
type: "removed",
data: id
});
}
}
});
self.added("collectionTest", userId);
self.ready();
ready = true;
self.onStop(function () {
subHandle.stop();
});
});
附件是我从DB中删除文档的图像。 websocket消息,然后是客户端上的控制台。显示它只会为5个文档触发一次。
Showing the document id's I am deleting
DDP messages in 'websocket' confirmed they get to client
Single client message in client callback showing only document changed
更新:太平洋标准时间12/15/17 - 太平洋标准时间下午7:17
在对此进行了几个小时的工作后,找到一些相关的meteor帖子,观察回调和“Meteor.call”无法在内部工作,解决方案或黑客是将“Meteor.call”包装在“setTimeout”中值为0,它修复了它。
我在这里尝试过,它没有用,但后来我试着限制响应,它有效!不确定它是否是一个可靠的解决方案,但它是迄今为止我发现的唯一一个。
我不确定为什么会这样,或者首先导致问题的原因,欢迎任何解释。
服务器发布 -
Meteor.publish("ddpPub", function () {
var self = this,
ready = false;
var userId = self.userId;
var subHandle = TestData.find({}).observeChanges({
added: function (id, fields) {
if (ready) {
console.log("ADDING PUBLICATION");
self.changed("collectionTest", userId, {
type: "added",
data: {
id: id,
fields: fields
}
});
}
},
changed: function (id, fields) {
if (ready) {
console.log("CHANGING PUBLICATION");
self.changed("collectionTest", userId, {
type: "changed",
data: {
id: id,
fields: fields
}
});
}
},
removed: function (id) {
if (ready) {
console.log("REMOVING PUBLICATION");
ratePub(id, function (data) {
console.log("OBJECT DATA IS ", data);
self.changed("collectionTest", userId, data);
});
}
}
});
self.added("collectionTest", userId);
self.ready();
ready = true;
self.onStop(function () {
subHandle.stop();
});
});
var returnPub = function (id, callback) {
console.log("RETURNING PUB ");
callback({
id: id,
type: "removed",
data: id
});
};
var ratePub = _.rateLimit(returnPub, 10);