保持两个 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);
});

查看 https://github.com/matb33/meteor-collection-hooks