条件发布事件

时间:2014-06-23 07:46:29

标签: javascript sails.js

简介

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

问题

Sails允许您将redis用于会话和pubsub,这允许您扩展多个服务器。这一切都非常整洁,效果非常好,但它让我遇到了如何将事件发布到特定连接套接字(客户端)的问题。

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

TL; DR

如何根据相关模型中属性(createauthor)的值过滤哪些客户端收到recipient谓词事件?有没有其他方法可以确保只有这些客户端接收模型的更新?

1 个答案:

答案 0 :(得分:5)

这里有几个选项,但所有这些选项都没有真正使用默认的publishCreate方法,这会将created消息发送给通过{{1}订阅它的所有人}}

第一个选项是使用关联将您的.watch()模型与应该了解它的用户相关联,然后收听Message消息而不是publishAdd。例如,如果publishCreate实例与代表发件人和收件人的Message实例之间存在关联,则默认User逻辑也会触发{{1对于相关用户,表示已将新publishCreate添加到他们的publishAdd(或其他任何名称)集合中。

第二个选项是覆盖Message的默认messages,让它只发送给正确的用户。例如,如果只应通知收件人,则可以在 api / models / Message.js 中执行以下操作:

publishCreate

作为一种替代方法,您可以将自定义代码放入模型的Message方法中,然后默认attributes: {...}, publishCreate: function (values, req, options) { User.publish(values.recipient, { verb: "created", data: values, id: values.id }, req); } 将调用该方法。这样做的好处是可以维护处理相关模型调用afterPublishCreate的默认代码;诀窍就是确保没有人通过publishCreate订阅了模型教室,因此默认publishAdd不向用户发送.watch()消息#39;看到他们。