Javascript 保持两个流星收集同步

Javascript 保持两个流星收集同步,javascript,meteor,Javascript,Meteor,我想使ServiceConfiguration集合与设置集合保持同步。我已经(几乎)用observeChanges完成了这项工作,比如: var handle = Settings.find().observeChanges({ changed: function (id, post) { var insert = {}; post.hostName && (insert.host = post.hostName); pos

我想使
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()
handle,代码就可以正常工作


所以,我不能停止手柄,或者这会导致内存泄漏吗?或者我应该如何保持两个流星收集同步?

TL/DR-是的,您可以删除它

如果我理解正确,在这种情况下,多个用户可以订阅“设置”发布,可能会更改设置集合中的设置,并且您需要将这些设置自动传播到ServiceConfiguration集合

如果是这种情况,那么您不应该试图阻止观察者,因为它是一个全局构造,用于监视任何用户的所有更改。您需要停止obsever on publication closure的情况是从publish函数中运行obsever,因此会为每个连接的用户生成一个新的obsever。如果你在这种情况下不停止观察者,那么同一个用户可能会反复连接和断开连接,你可能会有无限数量的观察者在运行,你的应用程序也会死掉

然而,在这里,您将只有一个观察者,它独立于订阅客户端的数量运行。此外,当任何单个发布被停止时,您不能停止它,因为可能还有其他客户端订阅者可以继续进行更改


总之,可以删除
onStop
块。如果没有意义,请告诉我。

您可以使用
matb33:collection hooks
侦听集合的更新。这将是服务器端:

Settings.after.update(function(userId, doc, fieldNames, modifier, options){
    var insert = {};
    //...your logic
    ServiceConfiguration.configurations.update({service: "xmpp"}, insert);
});
退房