javascript – 条件发布事件
作者:互联网
介绍
我正在使用sails构建一个私人消息传递系统,但这个问题几乎适用于任何事情.我将使用消息传递系统作为示例,使问题更加清晰.作为一些背景信息,我正在使用最新的风帆0.10 RC.
问题
Sails允许您将redis用于会话和pubsub,这允许您扩展多个服务器.这一切都很整洁,效果非常好,但它让我想到如何将事件发布到特定的连接套接字(客户端).
有时您希望仅向参与者发布事件,就像私人消息系统一样.应该只通知作者和收件人线程中的新消息.你会怎么做到这一点?我知道您可以将客户订阅到特定的模型实例,通知客户端所述模型的更改;我也知道可以将客户端订阅到模型,通知他们新创建(保存)的模型实例.这是后者,创造动词给我带来了一些麻烦.我不希望每个使用消息传递系统的人都在他们不在的线程中接收新消息的更新.这将是一个隐私问题.
TL; DR
如何根据相关模型上的属性(作者和收件人)的值过滤哪些客户端接收创建动词事件?有没有其他方法可以确保只有这些客户端接收模型的更新?
解决方法:
这里有几个选项,但所有这些选项都没有真正使用默认的publishCreate方法,它只会将创建的消息发送给通过.watch()订阅它的每个人.
第一个选项是使用关联将Message模型链接到应该知道它的用户,然后监听publishAdd消息而不是publishCreate.例如,如果Message实例与表示发件人和收件人的User实例之间存在关联,则默认的publishCreate逻辑还将触发相关用户的publishAdd,表示已将新邮件添加到其邮件中(或无论你怎么命名的)集合.
第二个选项是覆盖Message的默认publishCreate,使其仅发送给正确的用户.例如,如果只应通知收件人,那么在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不会向不应该看到它们的用户发送创建的消息.
标签:javascript,sails-js 来源: https://codeday.me/bug/20190830/1770060.html