保持两个Meteor集合同步

时间:2015-01-20 13:18:23

标签: javascript meteor

我希望将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集合同步?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

TL / DR - 是的,您可以将其删除。

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

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

但是,在这里,您只能拥有一个观察者,该观察者的运行与订阅客户端的数量无关。此外,当任何单个出版物停止时,您无法阻止它,因为可能仍有其他客户订阅者可以继续进行更改。

总之,删除onStop块很好。如果这没有意义,请告诉我。