想象一下,我有一个User
模型和一个Message
模型。用户有很多消息。
然后在客户端我做了一个:
io.socket.get('/user/2/messages'....
我获取了所有用户消息,尝试获取其他消息没有问题,因为我有一个策略。好。
我想听用户是否有新消息,如果我这样做:
io.socket.on('message')
我得到的每条信息都是我的,不管是我的。
所以:我可以只收听我的短信吗? AKA收听相关消息,但不是全部。
也许正在使用政策或其他东西。因为即使有一种方法可以听取它们,任何人都可以修改客户端以听取他想要的内容,我需要过滤掉所有内容。
答案 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 数组。上下文是您感兴趣的特定事件,例如update
或destroy
(更多关于上下文in the docs)。最后,您可以将autoSubscribe
设置为false
以完全限制对该模型的订阅。然后,只要您想要监听事件,就可以使用.subscribe()
手动订阅。
您可以在sailsChat示例应用中查看一些上下文示例和autoSubscribe
。