Pierre
Pierre

Reputation: 1227

Internal Server Error trying to update server database in Meteor.js

I've been modifying the example meteor app at http://meteor.com/examples/leaderboard. As you can see in the code bellow, I'm trying to update the score of players upon someone hitting the reset button. This updated fine on the client side but in my console I noticed the error "update failed: 500 -- Internal server error". Upon further inspection I saw that indeed, the server side database was not being updated. Any thoughts? (relevant code is in the reset function but I've posted the rest here just in case)

// Set up a collection to contain player information. On the server,
// it is backed by a MongoDB collection named "players."

Players = new Meteor.Collection("players");

var SORT_OPTIONS = {
  name:  {name: 1, score: -1},
  score: {score: -1, name: 1}
}

var NAMES = [ "Ada Lovelace",
              "Grace Hopper",
              "Marie Curie",
              "Carl Friedrich Gauss",
              "Nikola Tesla",
              "Claude Shannon" ];

function reset(options) {
  if (options && options['seed'] === true) {
    for (var i = 0; i < NAMES.length; i++) {
      Players.insert({ name: NAMES[i], score: Math.floor(Math.random()*10)*5 });
    }
  }

  if (options && options['restart'] === true) {
  Players.update( {},
                  { $set: { score: Math.floor(Math.random()*10)*5 } },
                  {multi: true});
  }

}

if (Meteor.is_client) {
  Template.leaderboard.players = function () {
    var sort_by = SORT_OPTIONS[Session.get("sort_by")]
    return Players.find({}, {sort: sort_by});
  };

  Template.leaderboard.selected_name = function () {
    var player = Players.findOne(Session.get("selected_player"));
    return player && player.name;
  };

  Template.player.selected = function () {
    return Session.equals("selected_player", this._id) ? "selected" : '';
  };

  Template.leaderboard.events = {
    'click input.inc': function () {
      Players.update(Session.get("selected_player"), {$inc: {score: 5}});
    },
    'click input.sort': function () {
      Session.get("sort_by") == "score" ? Session.set("sort_by", "name") : Session.set("sort_by", "score");
    },
    'click input.reset': function () {
      reset({'restart': true});
    }
  };

  Template.player.events = {
    'click': function () {
      Session.set("selected_player", this._id);
    }
  };
}

// On server startup, create some players if the database is empty.
if (Meteor.is_server) {
  Meteor.startup(function () {
    if (Players.find().count() === 0) {
      reset({'seed': true});
    }
  });
}

Upvotes: 0

Views: 1901

Answers (2)

jay
jay

Reputation: 507

This also happened to me, but checking the server log, the problem I had was that the $inc modifier requires a number for the argument for the update method, so I made sure it got it with Number()

Upvotes: 1

Pierre
Pierre

Reputation: 1227

Time went by and it now works :) I guess it was some server issue on their demo deploy site.

Upvotes: 0

Related Questions