介绍
我正在使用Sails构建一个私有(private)消息传递系统,但是这个问题几乎可以适用于所有问题。我将以消息传递系统为例,以使问题更清楚。作为一点背景信息,我正在使用最新的Sails 0.10 RC。
问题
Sails允许您将redis用于 session 和pubsub,从而可以扩展多个服务器。这一切都非常整洁,而且效果出色,但是这给我留下了的问题,即如何将事件发布到特定的已连接套接字(客户端)。
有时您希望只将事件发布给参与者,例如私有(private)消息传递系统。该线程中的新消息仅应通知作者和收件人。您将如何实现?我知道您可以为客户订阅特定的模型实例,并通知客户该模型的更改;我也知道有可能为客户端订阅模型,并向他们通知新创建(保存)的模型实例。是后者,create
动词给我带来了一些麻烦。我不希望所有使用消息传递系统的人都在他们不在的线程中接收新消息的更新。这将是一个隐私问题。
TL; DR
如何根据所讨论模型的属性值(create
和author
)过滤哪些客户端收到recipient
动词事件?还有其他方法可以确保仅这些客户端收到该模型的更新吗?
最佳答案
您在此处有一些选择,但是所有选择都没有真正使用默认的publishCreate
方法,该方法只会将created
消息发送给所有通过.watch()
订阅该消息的人。
第一种选择是使用关联将Message
模型链接到应该知道它的用户,然后侦听publishAdd
消息而不是publishCreate
。例如,如果Message
实例与代表发送者和接收者的User
实例之间存在关联,则默认publishCreate
逻辑还将触发相关用户的publishAdd
,表明已将新的Message
添加到他们的messages
中(或不论您如何命名)集合。
第二个选项是覆盖publishCreate
的默认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
消息。