过滤socket.io订阅

时间:2014-05-21 19:18:37

标签: socket.io sails.js

想象一下,我有一个User模型和一个Message模型。用户有很多消息。

然后在客户端我做了一个:

io.socket.get('/user/2/messages'....

我获取了所有用户消息,尝试获取其他消息没有问题,因为我有一个策略。好。

我想听用户是否有新消息,如果我这样做:

io.socket.on('message')

我得到的每条信息都是我的,不管是我的。

所以:我可以只收听我的短信吗? AKA收听相关消息,但不是全部。

也许正在使用政策或其他东西。因为即使有一种方法可以听取它们,任何人都可以修改客户端以听取他想要的内容,我需要过滤掉所有内容。

1 个答案:

答案 0 :(得分:1)

是的,你可以。诀窍是使用" addedTo"来监听用户事件。动词,而不是直接听取消息创建。代码类似于:

io.socket.on('user', function(msg) {

    if (msg.verb == 'addedTo' && msg.attribute == 'messages') {

        // A new message was added to the user's "messages" collection
        var messageId = msg.addedId
        // From here you can request /message/[messageId] to get the
        // message details if you need them

    }

});

有关.publishAdd() doc page的更多信息。

请注意,仅提供添加的消息的ID;你可能会发现你想要整件事。您可以通过单独请求新邮件或按suggested in this answer覆盖publishAdd来处理此问题。

这里唯一的问题是确保您限制谁订阅了这些用户事件。听起来您制定了一项政策,阻止用户访问其他用户的 / user /:id / messages 。您希望阻止他们为其他用户访问 / user /:id (至少通过套接字),因为他们将订阅他们以这种方式访问​​的任何用户。

如果这是不受欢迎的 - 也就是说,如果您喜欢的人能够点击这些路线 - 那么另一种选择就是使用autoSubscribe模型用于限制蓝图通常执行的自动订阅的属性。 autoSubscribe通常设置为true,这意味着每当为模型发出套接字请求时,请求套接字将订阅该模型实例的所有事件。您可以将其设置为应订阅的 contexts 数组。上下文是您感兴趣的特定事件,例如updatedestroy(更多关于上下文in the docs)。最后,您可以将autoSubscribe设置为false以完全限制对该模型的订阅。然后,只要您想要监听事件,就可以使用.subscribe()手动订阅。

您可以在sailsChat示例应用中查看一些上下文示例和autoSubscribe