简介
我正在使用 sails 构建一个私有(private)消息系统,但这个问题几乎适用于任何事情。我将以消息传递系统为例来使问题更清楚。作为一些背景信息,我正在使用最新的 sails 0.10 RC。
问题
Sails 允许您将 redis 用于 session 和 pubsub,这允许您在多个服务器上进行扩展。这一切都非常简洁并且工作出色,但它留给我的问题是如何将事件发布到特定连接的套接字(客户端)。
有时您希望只向参与者发布事件,就像私有(private)消息传递系统的情况一样。只有作者和收件人会收到线程中新消息的通知。你将如何做到这一点?我知道您可以为客户订阅一个特定的模型实例,通知客户该模型的变化;我也知道可以让客户订阅模型,通知他们新创建(保存)的模型实例。是后者,create
动词给我带来了一些麻烦。我不希望每个使用消息系统的人都在他们不在的线程中接收新消息的更新。这将是一个隐私问题。
长话短说
如何根据模型上的属性值(author
和 recipient
)过滤哪些客户端接收 create
动词事件有问题吗?有没有其他方法可以确保只有这些客户端收到模型的更新?
最佳答案
您在这里有几个选项,但所有这些选项都没有真正使用默认的 publishCreate
方法,它只会向所有订阅的人发送 created
消息通过 .watch()
访问它。
第一个选项是使用关联将您的Message
模型链接到应该知道它的用户,然后监听publishAdd
消息而不是发布创建
。例如,如果 Message
实例与代表发送者和接收者的 User
实例之间存在关联,则默认的 publishCreate
逻辑也将为相关用户触发一个 publishAdd
,表示一个新的 Message
已经被添加到他们的 messages
(或任何你命名的)集合中。
第二个选项是为 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 - 条件发布事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24360816/