流星 - 改变发布数据

时间:2016-02-18 09:27:08

标签: mongodb security meteor publish playing-cards

我在Meteor做一个纸牌游戏。每个玩过的游戏都在游戏"游戏"中注册。 一场比赛'记录包含一些游戏信息以及玩家的一些玩家信息和牌手(players[i].cards,其价值如4S - 4锹,KH - 心之王。 ..)。根据卡片值,我可以向前端显示正确的卡片(div.card-KH)。

大多数游戏数据都是公开的,但当然,只有当前玩家的牌必须可见。

一种选择可能是在发布时排除其他玩家的牌,但我仍然需要显示其他玩家的牌组(仅剩余牌,隐藏牌)的数量。

有没有办法将players[i].cards中每张卡的卡值(用户除外)换成BACK div.card-BACK)< / em>在发布时间?另外,在Meteor中这样做的好设计模式是什么?

2 个答案:

答案 0 :(得分:2)

有趣的问题,我认为应该有一个官方指南。

他们在发布文档中有一点: http://docs.meteor.com/#/full/meteor_publish(secretinfo字段仅发布给管理员) 您可以这样做,但您必须检查userId并拥有一个player1secretinfo,player2secretinfo等(或者可能是一个secretinfo数组/对象,但那时你只需要发布一个特定的索引/属性)

您还可以在出版物中进行转换: https://www.eventedmind.com/items/meteor-transforming-collection-documents

如果您找到一个好的解决方案,请发布它:)

答案 1 :(得分:1)

这是我找到的唯一解决方案(我不喜欢它,但它有效):

基本上,您必须将具有相同ID但已修改数据的临时文档存储到另一个Collection,从该Collection发布该文档,最后从客户端订阅该发布。 当然,永远不要通过另一个出版物提供原始文档的隐藏部分。

Meteor.publish('gameWithHiddenCards', function (gameId) {
    var self = this;

    //Transform function
    var transform = function(item) {
        for (var i=0; i<item.players.length; i++){
            if ((item.players[i].id != self.userId))
                for (var j = 0; j < item.players[i].cards.length; j++)
                    item.players[i].cards[j] = 'back';
        return item;
    };

    /* 1. Observe changes in game ;
       2. Apply transform function on game data ;
       3. Store it to another Collection. */
    var observer = Games.find({_id: gameId}).observe({
        added: function (document) {
            self.added('secure_games', document._id, transform(document));
        },
        changed: function (newDocument, oldDocument) {
            self.changed('secure_games', newDocument._id, transform(newDocument));
        },
        removed: function (oldDocument) {
            self.removed('secure_games', oldDocument._id);
        }
    });

    self.onStop(function () {
        observer.stop();
    });

    // Return altered game
    return SecureGames.find({_id: gameId});
});