部署后,辅助函数中的mongodb属性的Meteor Session.set()无法正常工作

时间:2014-01-22 02:47:53

标签: javascript mongodb meteor

我正在尝试从mongodb中的属性设置会话。我在本地工作,但在部署后,我在控制台中出现此错误,并出现白屏死机。

  

Deps重新计算的异常:TypeError:无法读取属性   'siteTheme'未定义

// helper
Handlebars.registerHelper("site", function(){
      host =  headers.get('host');
      theSite = Site.findOne({'domain': host});
      theme = theSite.siteTheme;  
      // Problem - Works locally, not deployed with mup.
      // Exception from Deps recompute: TypeError: Cannot read property 'siteTheme' of undefined 
      Session.set("theme", theme); 

      return theSite;
});



// Add theme class to html

siteTheme0 = function(){
  $('html').addClass('theme0');
};
siteTheme1 = function(){
  $('html').addClass('theme1');
};
siteTheme2 = function(){
  $('html').addClass('theme2');
};
siteTheme3 = function(){
  $('html').addClass('theme3');
};


// Change theme on change to db

Deps.autorun(function (c) {

  if (Session.equals("theme", "1")){
    siteTheme1();
  }
  else if (Session.equals("theme", "2")){
    siteTheme2();
  }
  else if (Session.equals("theme", "3")){
    siteTheme3();
  }
  else {
    Session.set("theme", "0");
    siteTheme0();
  }
});

1 个答案:

答案 0 :(得分:2)

这是流星最常遇到的问题之一。调用助手时(或者不存在),您的收集数据尚未就绪,因此Site.findOne会返回undefined,您无法访问siteTheme undefined 。请参阅我对this question的回答。基本上你只需要添加某种保护或返回语句,并假设数据可能没有准备好。例如:

Handlebars.registerHelper("site", function(){
  var host = headers.get('host');
  var theSite = Site.findOne({'domain': host});
  if (theSite) {
    var theme = theSite.siteTheme;
    Session.set("theme", theme);
    return theSite;
  }
});

如果代码的其余部分写得正确,那么只要数据准备好,您的模板就会再次呈现。