Meteor multiplayer gaming games go out of sync - how to debug?

I created a simple real-time multiplayer math game in Meteor that you can try here: http://mathplay.meteor.com

When playing locally (using different browsers) everything works fine. But when I play over the Internet with friends, clients often go out of sync: the question indicated as active for one player is actually already resolved by the other player.

I assume that some code, which should only be a server, runs on one of the clients. Any suggestions for debugging this behavior?

This is what happens on the client when the user sends a response:

Template.number_input.events[okcancel_events('#answertextbox')] = make_okcancel_handler({
    ok: function (text, event) {
        question = Questions.findOne({ order_number: Session.get("current_question_order_number") });
        if (question.answer == document.getElementById('answertextbox').value) {
            console.log('True');
            Questions.update(question._id, {$set: {text: question.text.substr(0, question.text.length - 1) + question.answer, player: Session.get("player_name")}});
            callGetNewQuestion();
        }
        else {
            console.log('False');
        }
        document.getElementById('answertextbox').value = "";
        document.getElementById('answertextbox').focus();
    }
});

callGetNewQuestion () runs this on both the client and server:

getNewQuestion: function () {
    var nr1 = Math.round(Math.random() * 100);
    var nr2 = Math.round(Math.random() * 100);
    question_string = nr1 + " + " + nr2 + " = ?";
    question_answer = (nr1 + nr2);
    current_order_number = Questions.find({}).count() + 1;
    current_question_id = Questions.insert({ order_number: current_order_number, text: question_string, answer: question_answer });
    return Questions.findOne({_id: current_question_id});//current_question_id;
},

: https://github.com/tomsoderlund/MathPlay

+5
1

:

callGetNewQuestion() ,

_id - , , , . . , , .


, , . , , . , .


:

return Questions.findOne({_id: current_question_id});

( , ):

Session.set('current_order', current_order_number); // ORDER! Not the _id / question_id.

, :

return Questions.findOne({ order_number: Session.get('current_order') });

, .

+3

All Articles