2014-05-21 66 views
1

想象一下,我有一個User模型和一個Message模型。用戶有很多消息。過濾socket.io訂閱

然後在客戶端我做了:

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

我讓我所有的用戶信息,也沒有試圖讓某人的其他消息,因爲我有一個政策問題。好。

我要聽用戶是否有新郵件,如果我做了:

io.socket.on('message') 

我得到創建的每個消息,礦場或不是我的。

所以:我可以只聽我的信息嗎? AKA傾聽關聯的消息,但不是全部。

也許使用政策或其他的東西。因爲即使有辦法傾聽他們,任何人都可以修改客戶端以聽取他想要的內容,我需要過濾所有這些內容。

回答

1

是的,你可以。訣竅是使用「addedTo」動詞監聽用戶事件,而不是直接偵聽消息創建。該代碼會是這樣的:在.publishAdd() doc page

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 

    } 

}); 

更多信息。

請注意,只有添加的消息的ID是給定的;你可能會發現你想要的東西。您可以通過爲新消息提出單獨請求來處理該問題,或者如suggested in this answer覆蓋publishAdd

這裏唯一的問題是確保你限制誰訂閱了這些用戶事件。這聽起來像你有一個防止用戶訪問其他用戶的/user /:id/messages的策略。您還需要阻止其他用戶(至少通過套接字)訪問/user /:id,因爲他們將訂閱以任何方式訪問的用戶。

如果這是不可取的 - 也就是說,如果你願意喜歡人能夠擊中這些路線 - 那麼一個替代方案是使用autoSubscribe模型屬性限制自動訂閱,藍圖通常做。 autoSubscribe通常設置爲true,這意味着無論何時爲模型創建套接字請求,請求套接字都將訂閱該模型實例的所有事件。您可以將其設置爲應該訂閱的上下文的數組。上下文是您感興趣的特定事件,例如updatedestroy(更多關於上下文in the docs)。最後,您可以將autoSubscribe設置爲false以完全限制對該模型的訂閱。然後,只要您想收聽活動,您就可以手動訂閱.subscribe()

您可以在sailsChat示例應用程序中看到上下文的一些示例和autoSubscribe