Meteor.user()在函数内部未定义

时间:2014-08-26 07:42:42

标签: meteor

我有这个模板助手

Template.foo.helpers
  'bar':->
    console.log(Meteor.user().profile)
  'baz':->
    console.log(Meteor.user().profile)
  'buzz':->
    console.log(Meteor.user().profile)

它可以完美地记录用户对象。

但是当我尝试在模板助手之外使用它时,它会返回Uncaught TypeError: Cannot read property 'profile' of undefined

喜欢这个

checkProfile=(profile)->
  console.log profile

Template.foo.helpers
  'bar':checkProfile(Meteor.user().profile)
  'baz':checkProfile(Meteor.user().profile)
  'buzz':checkProfile(Meteor.user().profile)

我认为它在加载Meteor.user()之前执行该函数但是当我尝试在checkProfile中记录Meteor.userId时,ex:

checkProfile=(profile)->
  console.log Meteor.userId()
  console.log profile

甚至

checkProfile=(profile)->
  console.log Meteor.userId()
  console.log(Meteor.user())

尽快记录userId,但仍然会返回未捕获的错误。

现在我得出结论,Meteor.userId()在流星开始时始终可用,Meteor.user()对象在之后被加载?

请告诉我这个结论,因为这些小事可能会成为我未来代码中的一个大问题。谢谢。

旁注:

我确定用户已登录,因为我在用户登录时测试错误测试。只是在页面刷新时,代码运行并在尝试运行Meteor.user()时返回该错误

2 个答案:

答案 0 :(得分:3)

您的错误是由于尝试访问"个人资料"在未定义的对象上。因此它与checkProfile函数无关。

模板的帮助程序包含Deps.autorun,这意味着如果将响应数据源(如Meteor.user())放在帮助程序中,则每次更改反应数据源时都会重新运行帮助程序。

考虑在帮助者中使用警卫:

var user = Meteor.user();
var profile = user && user.profile;
if(profile){
  checkProfile(profile);
}

上面的代码会运行几次 - 每次Meteor.user()的数据都会更改。

了解它的工作原理: http://meteorpad.com/pad/j2bqKeMfuuLpbn2TW

创建帐户,打开控制台,然后刷新流星应用程序以查看日志。

旁注

您可以检查您是否登录:

if(Meteor.loggingIn()){
  ...
}

答案 1 :(得分:0)

您是否有机会在出版物中调用checkProfile?如果是这样,您需要使用publication的this.userId