铁路由器没有等待meteor.user()返回

时间:2014-11-04 01:42:48

标签: javascript meteor iron-router

已解决,但正在寻求改进,请参阅答案

    function completedProfile() {
        if (Meteor.user() && Meteor.user().profile.primary_email && Meteor.user().profile.display_name && Meteor.user().university_id) {
            return true;
        } else {
            return false;
        }
    }

    Router.map(function() {
        this.route('landing', {
            path: '/', // match the root path
            onBeforeAction: function() {
                this.subscribe('users').wait();
                if (this.ready() && completedProfile()) {
                    this.render('bulletin')
                } else {
                    this.redirect('splash');
                }
            }
        });
    });

由于completeProfile函数为false(if语句中的所有字段均为空),页面将重定向到我的splash模板。

尝试2(填充字段后挂起):

    Router.map(function() {
        this.route('landing', {
            path: '/', // match the root path
            action: function() {
                if (this.ready() && completedProfile()) {
                    this.redirect('bulletin')
                } else {
                    this.render('splash');
                }
            },
        });

尝试3:

    function completedProfile() {
        if (Meteor.user() && Meteor.user().profile.primary_email && Meteor.user().profile.display_name && Meteor.user().profile.university_id) {
            return true;
        } else {
            return false;
        }
    }

    Router.map(function() {
                this.route('landing', {
                    path: '/', // match the root path
                    action: function() {
                        console.log(Meteor.user().profile);  //this fails
                        console.log(this.ready(), completedProfile()); //this then returns as expected
                        if (this.ready() && !completedProfile()) {
                            this.redirect('splash');
                        } else {
                            this.render('bulletin')
                        }
                    },
                });

                this.route('splash', {
                    path: '/splash', // match the root path
                });

                this.route('bulletin', {
                    path: '/bulletin', // match the root path
                });

这很有道理。 Meteor.user的日志导致错误,然后 Meteor.user()加载给我一个适当的completedProfile()返回。错误是Exception in callback of async function: TypeError: Cannot read property 'profile' of undefined

2 个答案:

答案 0 :(得分:2)

您似乎正在重定向到名为splash的路线。你没有包含它,但我认为它存在。一旦您重定向,您就完成了landing路由的任何逻辑,因此一旦用户登录就不会重新运行completedProfile()

请改为尝试:保持landing路线,但render()启动页面,直到用户登录。

if (this.ready() && completedProfile()) {
    this.render('bulletin')
} else {
    this.render('splash');
}

我认为this.subscribe('users').wait();没有帮助。我会删除它。我想你也想使用action而不是onBeforeAction,因为你自己打电话给render()

另见:https://github.com/EventedMind/iron-router/issues/91。听起来像instant login这样可以很好地适用于您的用例。

答案 1 :(得分:1)

当前的工作解决方案:

    function completedProfile() {
        if (Meteor.user() && Meteor.user().profile.primary_email && Meteor.user().profile.display_name  && Meteor.user().profile.university_id) {
          return true;
        } else {
          return false;
        }
    }

    Router.map(function() {
        this.route('landing', {
            path: '/', // match the root path
            action: function() {
                if (this.ready()) {
                    if (!completedProfile()) {
                        this.render('splash');
                        this.stop();
                    } else {
                        this.render('bulletin')
                    }
                }    
            }
        }
    });