假设如下当前情况:服务器侧无功流星出版
- 我有一个集“表”
- 表是具有相似特性的对象{私人: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 –
没关系,我想出了:) –