如何推迟阅读直到写作完成?

时间:2015-06-17 08:48:53

标签: javascript node.js mongodb websocket socket.io

我正在使用node.js,socket.io和MongoDB制作多人游戏。

当玩家死亡时,他们可以在致命一击之前重新加载浏览器,即使杀死已经注册,他们仍然活着。我使用以下解决方案来保存/加载播放器:

socket.sockets.on('connection', onSocketConnection);

function onSocketConnection(client) {
    util.log('New player has connected: '+client.id);

    client.on('new player', function() {
        db.collection('players').findOne({uuid: uid}, function(err, data) {
            var player = new Player(data);
            players.push(player);
        });
    });

    client.on('disconnect', function() {
        db.collection('players').update({uuid: player.uuid}, {$set: player}, {w: 1}, function(err, result) {
            console.log('player written');
        }); 
    });
};

我认为发生的是"断开"事件开始写作但在完成之前#34;新玩家"事件触发,从数据库加载播放器并再次初始化它。因此,读取在写入完成之前发生(这意味着它们将在现在发生之前从断开连接获得播放器的状态。)

这是问题吗?如果没有,我的方法还有什么可以导致这种情况吗?如果这确实是问题,我该如何解决?

1 个答案:

答案 0 :(得分:1)

在多人游戏中,您需要在服务器上执行重要的状态逻辑,或者至少在服务器端进行某种状态验证。

你只是注意到了这个" hack"因为这很容易做到。你必须设计你的多人游戏服务器,以抵御那些有经验的用socket.io编写自己的客户端的人。基本上,这意味着您不应该自动信任来自任何客户的重要数据。

在您的情况下,您需要在死亡前尽早发出请求。这可能会阻止大多数人形成此漏洞,但任何知道某些javascript并且拥有chrome的人都可以阻止该请求被发送。