Meteor.call is returning Error invoking Method 'addToMenu': Internal server error [500]

10,965

I'm guessing the problem is that there's no mealId variable in scope in the addToMenu method. You probably meant to pass it as a parameter:

Meteor.methods({
  addToMenu: function(mealId, options) {
    check(mealId, String);
    // rest of function body unchanged
  }
});

addToMenu = function(mealId, options) {
  var id = Random.id();
  Meteor.call('addToMenu', mealId, _.extend({ _id: id}, options));
  return id;
};

'click .save': function (event, template) {
  var mealId = Session.get('selected');
  var category = template.find(".category").value;
  var dish = template.find(".dish").value;
  if (category.length && dish.length) {
    addToMenu(mealId, {category: category, dish: dish});
  }
}
Share:
10,965
Chad_Martinson
Author by

Chad_Martinson

Updated on June 09, 2022

Comments

  • Chad_Martinson
    Chad_Martinson almost 2 years

    I am new to Meteor and am trying to use a Meteor.call() to push an object to an array in my collection. Here is my code.

    My template events map

    'click .save': function (event, template) {
    var mealId = Session.get('selected');
    var category = template.find(".category").value;
    var dish = template.find(".dish").value;
     if (category.length && dish.length) {
      addToMenu({
        category: category,
        dish: dish
      });
    

    and my model.js in the shared folder,

    addToMenu = function(options) {
    var id = Random.id();
    Meteor.call('addToMenu',_.extend({ _id: id}, options));
    return id;
    };
    
    Meteor.methods({
    createMeal: function(options) {
    check(options, {
      date: String,
      time: String,
      street: String,
      city: String,
      state: String,
      zipcode: String,
      _id: Match.Optional(String)
    });
    
    if (options.street.length > 100)
      throw new Meteor.Error(413, 'Street address too long');
    if (options.city.length > 25)
      throw new Meteor.Error(413, 'City name too long');
    if (options.state.length > 20)
      throw new Meteor.Error(413, 'State name too long');
    if (! this.userId)
      throw new Meteor.Error(403, 'You must be logged in');
    
    var id = options.id || Random.id();
    Meals.insert({
      _id: id,
      owner: this.userId,
      street: options.street,
      city: options.city,
      state: options.state,
      zipcode: options.zipcode,
      date: options.date,
      time: options.time,
      menu: [],
      ingredients: [],
      invited: [],
      rsvps: []
    });
    return id;
    },
    
    
    
    addToMenu: function(options) {
    check(options, {
      category: String,
      dish: String,
      _id: Match.Optional(String)
    });
    if (! this.userId)
      throw new Meteor.Error(403, "You must be logged in to add dishes.");
    if (! mealId)
      throw new Meteor.Error(404, "No such meal");
    Meals.update(mealId, {$addToSet: {menu: {category: options.category, dish:
    options.dish}}});
    },
    

    I could have just created a related collection called Menu and set {owner: mealId} but I really wanted to run this exercise of embedded documents on MongoDB. Any input would be greatly appreciated.

  • Chad_Martinson
    Chad_Martinson almost 10 years
    That was it! Thanks for looking I greatly appreciate it.