Meteor collection.update导致会话变量被重置

时间:2014-09-03 21:45:37

标签: meteor

正在发生的事情是,当点击.addGuest时,一切都有效,除了用餐变得不确定,我的观点被打破了。 {{#if owner}}显示的所有内容都不会显示,我在控制台中收到此错误。

Exception in template helper: TypeError: Cannot read property 'owner' of undefined
at Object.Template.menu_details.helpers.owner     (http://localhost:3000/client/workflow/meal_details_page/meal_details.js

我的服务器控制台上没有错误,所有传递的数据都存储在我的数据库中。不知怎的,Session.get('current_meal')正在丢失它在invite方法上的数据。我从事件处理程序中评论了它,其他一切都很完美。

由于

这是我的查询迷失了......

  meal: function () {
return MealModel.findOne(Session.get('current_meal'));
 },
 owner: function() {
var meal = MealModel.findOne(Session.get('current_meal'));
return meal.owner === Meteor.userId();
},

这是我在服务器中的方法

      invite: function (options) {
    check(options, {
      mealId: String,
      firstName: String,
      lastName: String,
      email: String
    });
    var meal = MealModel.findOne(options.mealId);
    if (! meal || meal.owner !== this.userId)
      throw new Meteor.Error(404, "No such meal");
    MealModel.update(options.mealId, {$addToSet: {
      invited: {
        firstName: options.firstName,
        lastName: options.lastName,
        email: options.email
      }}});
  },

我的Meteor.call功能...

  invite = function(options) {
Meteor.call('invite', options);
  },

最后,我的事件处理程序......

  'click .addGuest': function (evt, tmpl) {
var firstName = tmpl.find('.firstName').value;
var lastName = tmpl.find('.lastName').value;
var email = tmpl.find('.email').value;
var meal = Session.get('current_meal');

if (firstName.length && lastName.length && email.length) {
  var id = createGuest({
    firstName: firstName,
    lastName: lastName,
    email: email,
    meal: meal._id,
    owner: meal.owner
  });
 invite({
    firstName: firstName,
    lastName: lastName,
    email: email,
    mealId: meal._id
  });
};
return false;
},

1 个答案:

答案 0 :(得分:2)

您的问题中缺少的代码是您设置会话变量current_meal的位置。您必须小心使用findOne,因为它在没有找到文档时返回null - 如果集合中确实没有匹配的文档,而且如果您在客户端上,则会发生这种情况并且匹配的文件还没有同步到客户端。

要修复此问题,请找到代码为Session.set('current_meal', meal)或类似的代码,然后添加一项检查,以便仅在meal不为空时才会发生:

if (meal != null)
  Session.set('current_meal', meal);

此外,在click .addGuest事件处理程序中,检查meal是否有效,就像检查其他值一样:

if (firstName.length && lastName.length && email.length && meal != null) {