等待Meteor.user()

时间:2014-12-14 09:07:06

标签: javascript meteor iron-router

如果新用户注册,我会将他们带到入门路线,以便他们输入可以输入/gs的名称。我将名称存储在当前用户的配置文件对象的name属性中。现在,如果已经输入名称并访问/gs路由的用户,我想将其重定向到根目录。在铁路由器中,我这样做:

Router.route('/gs', {
  name: 'gs',
  onBeforeAction: function() {
    if ( Meteor.user().profile.name ) {
      this.redirect('/');
    } else {
      this.render();
    }
  }
});

即使这样可行,它也会向控制台输出2个错误。其中一个是“无法读取未定义的属性'配置文件”和缺少this.next()。任何解决这些问题的方法。

2 个答案:

答案 0 :(得分:5)

  

您的路线功能和大多数挂钩都是在反应计算中运行的。这意味着如果响应数据源发生更改,它们将自动重新运行。例如,如果在路由功能中调用Meteor.user(),则每次Meteor.user()的值发生更改时,路由功能都将重新运行。 (Iron.Router Guide: Reactivity

     

Hook函数以及在调度到路由时运行的所有函数都在被动计算中运行:如果任何被动数据源使计算无效,它们将重新运行。在上面的示例中,如果Meteor.user()更改,则将再次运行整组路由功能。   (Iron.Router Guide: Using Hooks

第一次运行该功能时,Meteor.user()undefined。然后它的值变为对象。因为它是一个反应变量,所以该函数再次运行,这次没有错误。

在使用其属性之前,您应该检查是否已定义Meteor.user()。这是一种非常(可能太多)详尽的方式:

if (Meteor.user() !== undefined) {
  // the user is ready
  if (Meteor.user()) {
    // the user is logged in
    if (Meteor.user() && Meteor.user().profile.name) {
      // the name is already set
      this.redirect('/');
    } else {
      this.render();
  } else {
    // the user is not logged in
} else {
  // waiting for the user to be ready
}

答案 1 :(得分:0)

Pandark有正确的答案,想分享我的工作代码!

Router.route('/account',{
fastRender: true,
data:function(){

    if( Meteor.user() && Meteor.user().profile.guest ){
        Router.go('/login');
    } else {
        Router.go('/account');
    }
},
template:'screen',
yieldTemplates: {
    'account': {to: 'content'},
}
});