Wes*_*ijk 3 javascript sails.js
我正在使用sails构建一个私人消息传递系统,但这个问题几乎适用于任何事情.我将使用消息传递系统作为示例,使问题更加清晰.作为一些背景信息,我正在使用最新的风帆0.10 RC.
Sails允许您将redis用于会话和pubsub,这允许您扩展多个服务器.这一切都很整洁,工作非常出色,但它让我想到如何将事件发布到特定的连接套接字(客户端).
有时您希望仅向参与者发布事件,就像私人消息系统一样.应该只通知作者和收件人线程中的新消息.你会怎么做到这一点?我知道您可以将客户订阅到特定的模型实例,通知客户端所述模型的更改; 我也知道可以将客户端订阅到模型,通知他们新创建(保存)的模型实例.这是后者,create动词给我带来了一些麻烦.我不希望每个使用消息传递系统的人都在他们不在的线程中接收新消息的更新.这将是一个隐私问题.
如何create根据相关模型上的属性(author和recipient)值过滤哪些客户端接收动词事件?有没有其他方法可以确保只有这些客户端接收模型的更新?
你在这里有几个选项,但所有这些选项都没有真正使用默认publishCreate方法,这只会将created消息发送给通过它订阅它的每个人.watch().
第一个选项是使用关联将Message模型链接到应该知道它的用户,然后监听publishAdd消息而不是publishCreate.例如,如果Message实例与User代表发件人和收件人的实例之间存在关联,则默认publishCreate逻辑也会触发publishAdd相关用户的a,表示已将新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);
}
Run Code Online (Sandbox Code Playgroud)
作为一个简单的替代方案,您可以将自定义代码放在模型的afterPublishCreate方法中,publishCreate然后默认将调用.这有利于维护处理调用publishAdd关联模型的默认代码; 诀窍就是确保没有人通过模型教室订阅.watch(),因此默认情况下publishCreate不会向不created应该看到它们的用户发送消息.