【问题标题】:Conditional publish events有条件的发布事件
【发布时间】:2014-06-23 07:46:29
【问题描述】:

简介

我正在使用 Sails 构建一个私人消息传递系统,但这个问题几乎适用于任何事情。我将使用消息系统作为示例,以使问题更清楚。作为一些背景信息,我正在使用最新的sails 0.10 RC。

问题

Sails 允许您将 redis 用于会话和 pubsub,这允许您在多个服务器上进行扩展。这一切都非常简洁而且工作出色,但它给我留下了如何将事件发布到特定连接的套接字(客户端)的问题。

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

TL;DR

如何根据相关模型上的属性值(authorrecipient)过滤哪些客户端接收到 create 动词事件?有没有其他方法可以确保只有这些客户端接收模型的更新?

【问题讨论】:

  • @ScottGress 我不这么认为。我想要特定用户的创建动词。我想我可以用自己的 emit 来处理这个问题,但我宁愿使用蓝图找到解决方案。

标签: javascript sails.js


【解决方案1】:

这里有几个选项,但所有选项都涉及不真正使用默认的publishCreate 方法,它只会向通过.watch() 订阅它的每个人发送created 消息。

第一个选项是使用关联将您的Message 模型链接到应该知道它的用户,然后收听publishAdd 消息而不是publishCreate。例如,如果Message 实例与代表发送者和接收者的User 实例之间存在关联,那么默认的publishCreate 逻辑也会为相关用户触发publishAdd,表示新的@ 987654331@ 已添加到他们的 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 不会向不应该看到它们的用户发送created 消息。

【讨论】:

  • 我通过自己推出事件以不同的方式解决了这个问题。我更喜欢您的(第二个)解决方案,并将相应地实施它。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多