假設如下當前情況:服務器側無功流星出版
- 我有一個集「表」
- 表是具有相似特性的對象{私人:0,PRIVATE1,private2,...} (席0,1,2 ...)
- 我發佈的收集與2個參數,一個TABLEID第二個座位。
- 考慮到座位上,公佈將過濾(隱藏)屬性的客戶端必須不能看到的。
- 對於現在的TABLEID和座位是從客戶端的會話採取所以一切是被動的。
- 我有一個「takeSeat(seatNb)」方法。如果一個客戶調用這個方法並且被允許在餐桌上就座,那麼座位號被髮回給客戶,然後客戶將它放入座位關鍵下的會話中。因此,這將更新訂閱並正確過濾表格的座位內容。
我不滿意這個設計,因爲我意識到客戶端可能是通過訂閱自己的座位作弊。另外(更重要的是)我在C++中使用另一個DDP客戶端,並希望將這個邏輯部分保留在服務器端。也就是說,一旦我拿到一個席位,就不必與另一個席位訂閱,如果我坐在桌子旁,我希望服務器自己在桌面上顯示正確的字段。
經過多次搜索,我決定拋開添加集合「玩家」,這樣我可能很容易讓我的「表」集合中通知的「玩家」添加或刪除的表。但這只是問題的一半。我必須切實改變出版物本身的處理程序,以便過濾器變成被動的。這是我卡住的地方,這裏有一些簡化的代碼來了解這種情況:
Meteor.publish("current-table", function(table_id)
{
var self = this;
var handle = Players.find({"tableID": table_id}).observeChanges(
{
added: function(id)
{
console.log("A player joined the table added");
self.changed("tables", table_id);
},
removed: function(id) {
console.log("A player left the table");
self.changed("tables", table_id);
}
});
self.onStop(function() {
handle.stop();
});
// PUBLISH THE TABLE BUT HIDE SOME FIELDS BEFORE
var player = Players.findOne({"userID": this.userId, "tableID": table_id}) || {"seat": -1};
var seat = player.seat;
var privateFilter = {"private0": false, "private1": false, "private2": false, "private3": false};
delete privateFilter["private" + seat];
return Tables.find(table_id, {fields: privateFilter});
});
如何繼續?有沒有更好的方法來實現這個目標?
你可以看看這個,所以我認爲我的問題和你的問題類似,但我不知道如何把它們放在一起? http://stackoverflow.com/q/34479708/271873 –
沒關係,我想出了:) –