保持两个 Meteor 集合同步
Keep two Meteor collections in sync
我想让 ServiceConfiguration
集合与设置集合保持同步。我已经(几乎)使用 observeChanges
完成了这个,就像这样:
var handle = Settings.find().observeChanges({
changed: function (id, post) {
var insert = {};
post.hostName && (insert.host = post.hostName);
post.domainName && (insert.domain = post.domainName);
ServiceConfiguration.configurations.update({service: "xmpp"}, insert);
}
});
Meteor.publish("Settings", function() {
this.onStop = function () {
handle.stop();
};
return Settings.find();
});
然而,此代码的问题在于发布的 onStop
方法是立即调用的,而不是在客户端断开连接时调用的。我使用该回调的原因是因为 Meteor 文档强调了手动取消 observeChanges
句柄的重要性,但如果我以这种方式取消它,那么我实际上无法观察到集合的变化。但是,如果我不 stop()
句柄,代码可以正常工作。
那么,我可以不停止句柄吗,否则会导致内存泄漏吗?或者我应该如何使两个 Meteor 集合保持同步?
TL/DR - 是的,您可以删除它。
如果我理解正确,在这种情况下,多个用户可以订阅 "Settings" 发布,可能会更改设置集合中的设置,并且您需要将这些设置自动传播到 ServiceConfiguration 集合。
如果是这种情况,那么您不应该试图阻止观察者,因为它是一个全局构造,旨在监视任何用户的所有更改。您需要在发布关闭时停止观察者的情况是观察者来自 在 发布函数中的 运行,因此会为每个连接的用户生成一个新的观察者.如果您在这种情况下不停止观察者,同一用户可能会重复连接和断开连接,您可能会留下无限数量的 运行ing 观察者,您的应用程序将会死亡。
然而,在这里,您将永远只有一个观察者,运行独立于订阅客户的数量。此外,您不能在任何单个发布停止时停止它,因为可能仍有其他客户订阅者可以继续进行更改。
综上所述,删除onStop
块就可以了。如果这没有意义,请告诉我。
您可以使用 matb33:collection-hooks
收听集合的更新。这将是服务器端:
Settings.after.update(function(userId, doc, fieldNames, modifier, options){
var insert = {};
//...your logic
ServiceConfiguration.configurations.update({service: "xmpp"}, insert);
});
我想让 ServiceConfiguration
集合与设置集合保持同步。我已经(几乎)使用 observeChanges
完成了这个,就像这样:
var handle = Settings.find().observeChanges({
changed: function (id, post) {
var insert = {};
post.hostName && (insert.host = post.hostName);
post.domainName && (insert.domain = post.domainName);
ServiceConfiguration.configurations.update({service: "xmpp"}, insert);
}
});
Meteor.publish("Settings", function() {
this.onStop = function () {
handle.stop();
};
return Settings.find();
});
然而,此代码的问题在于发布的 onStop
方法是立即调用的,而不是在客户端断开连接时调用的。我使用该回调的原因是因为 Meteor 文档强调了手动取消 observeChanges
句柄的重要性,但如果我以这种方式取消它,那么我实际上无法观察到集合的变化。但是,如果我不 stop()
句柄,代码可以正常工作。
那么,我可以不停止句柄吗,否则会导致内存泄漏吗?或者我应该如何使两个 Meteor 集合保持同步?
TL/DR - 是的,您可以删除它。
如果我理解正确,在这种情况下,多个用户可以订阅 "Settings" 发布,可能会更改设置集合中的设置,并且您需要将这些设置自动传播到 ServiceConfiguration 集合。
如果是这种情况,那么您不应该试图阻止观察者,因为它是一个全局构造,旨在监视任何用户的所有更改。您需要在发布关闭时停止观察者的情况是观察者来自 在 发布函数中的 运行,因此会为每个连接的用户生成一个新的观察者.如果您在这种情况下不停止观察者,同一用户可能会重复连接和断开连接,您可能会留下无限数量的 运行ing 观察者,您的应用程序将会死亡。
然而,在这里,您将永远只有一个观察者,运行独立于订阅客户的数量。此外,您不能在任何单个发布停止时停止它,因为可能仍有其他客户订阅者可以继续进行更改。
综上所述,删除onStop
块就可以了。如果这没有意义,请告诉我。
您可以使用 matb33:collection-hooks
收听集合的更新。这将是服务器端:
Settings.after.update(function(userId, doc, fieldNames, modifier, options){
var insert = {};
//...your logic
ServiceConfiguration.configurations.update({service: "xmpp"}, insert);
});