介绍

我正在使用Sails构建一个私有(private)消息传递系统,但是这个问题几乎可以适用于所有问题。我将以消息传递系统为例,以使问题更清楚。作为一点背景信息,我正在使用最新的Sails 0.10 RC。

问题

Sails允许您将redis用于 session 和pubsub,从而可以扩展多个服务器。这一切都非常整洁,而且效果出色,但是这给我留下了的问题,即如何将事件发布到特定的已连接套接字(客户端)

有时您希望只将事件发布给参与者,例如私有(private)消息传递系统。该线程中的新消息仅应通知作者和收件人。您将如何实现?我知道您可以为客户订阅特定的模型实例,并通知客户该模型的更改;我也知道有可能为客户端订阅模型,并向他们通知新创建(保存)的模型实例。是后者,create动词给我带来了一些麻烦。我不希望所有使用消息传递系统的人都在他们不在的线程中接收新消息的更新。这将是一个隐私问题。

TL; DR

如何根据所讨论模型的属性值(createauthor)过滤哪些客户端收到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消息。

09-25 17:09