保持两个流星收藏同步

Keep two Meteor collections in sync

本文关键字:两个 流星 收藏 同步      更新时间:2023-09-26

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

那么,我可以不停止句柄还是会给我内存泄漏?或者我应该如何保持两个流星收藏的同步?

您可以使用 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

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

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

如果是这种情况,则不应尝试停止观察器,因为它是一个全局构造,旨在监视任何用户的所有更改。 您需要在发布闭包时停止观察者的情况是,当观察器从发布函数运行时,因此会为每个连接的用户生成一个新的观察器。 如果您在这种情况下不停止观察者,则同一用户可能会反复连接和断开连接,并且您可能拥有无限数量的正在运行的观察者,并且您的应用程序将死亡。

但是,在这里,您永远只有一个观察器,该观察器独立于订阅客户端的数量运行。 此外,当任何单个发布停止时,您无法停止它,因为可能仍有其他客户端订阅者可以继续进行更改。

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