有条件的发布事件

2023-12-10

介绍

我正在使用 sails 构建一个私人消息系统,但这个问题几乎适用于任何事情。我将使用消息系统作为示例来使问题更清楚。作为一些背景信息,我正在使用最新的 sails 0.10 RC。

问题

Sails 允许您使用 redis 进行会话和 pubsub,这允许您在多个服务器上进行扩展。这一切都非常整洁并且工作出色,但它给我留下了一个问题:如何将事件发布到特定连接的套接字(客户端).

有时您希望只向参与者发布事件,就像私人消息系统的情况一样。只有作者和收件人才会收到线程中新消息的通知。你将如何实现这一目标?我知道您可以为客户端订阅特定的模型实例,通知客户端该模型的更改;我还知道可以向客户端订阅模型,通知他们新创建(保存)的模型实例。是后者,即create动词,这给我带来了一些麻烦。我不希望使用消息系统的每个人都在他们不在的线程中接收新消息的更新。这将是一个隐私问题。

TL;DR

我如何过滤哪些客户收到create基于属性值的动词事件 (author and recipient)关于有问题的模型?有没有其他方法可以确保只有这些客户端才能收到模型的更新?


这里有几个选项,但所有这些选项都不涉及真正使用默认值publishCreate方法,这只会爆炸created向通过以下方式订阅的每个人发送消息.watch().

第一个选项是使用关联来链接您的Message模型向应该了解它的用户展示,然后倾听publishAdd消息而不是publishCreate。例如,如果 a 之间存在关联Message实例和User代表发送者和接收者的实例,则默认publishCreate逻辑也会触发publishAdd对于相关用户,表明有一个新的Message已添加到他们的messages(或者无论你怎么称呼它)集合。

第二个选项是覆盖默认值publishCreate for Message,让它只发送给正确的用户。例如,如果只应通知收件人,则在api/models/Message.js你可以这样做:

attributes: {...},
publishCreate: function (values, req, options) {
    User.publish(values.recipient, {
        verb: "created",
        data: values, 
        id: values.id
    }, req);
}

作为一个小替代方案,您可以将自定义代码放置在模型的afterPublishCreate方法,默​​认值publishCreate然后会打电话。这样做的好处是可以维护处理调用的默认代码publishAdd对于相关模型;诀窍只是确保没有人通过以下方式订阅了模型教室.watch(),这样默认的publishCreate不发出created向不应看到的用户发送消息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有条件的发布事件 的相关文章

随机推荐