在所有事情之前检查Meteor.user()不仅有效路由

时间:2015-01-31 08:55:29

标签: meteor iron-router

我只是设置一个基本的应用程序。我有一个完整的路线和一个onBeforeAction来检查用户是否已登录。如果没有,它会在特殊布局中呈现一个登录模板(使用this.layout())。

此外,我在Router.configure()中有基本的layoutTemplate,loadingTemplate和notFoundTemplate设置,据我所知,为每个没有定义其他内容的Route设置默认值。

基本上一切都有一个例外:对于404事件,onBeforeAction不会被调用。这使得我的404模板在默认布局中呈现。我的目标是即使在不存在的路线上也要进行登录检查。

完成这项工作的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,这对我有用。

基本上,catchall路由仅用于检查用户是否已登录,如果没有重定向(或如果您愿意,则呈现)登录模板,如果用户已登录,则只需调用next()。它当然需要放在所有路线的最后。

不使用Router.configure()来设置notFoundTemplate,而是在catchall路由中渲染它。当你将它保留为最后一条路线时,则没有匹配的路线,它将是渲染notFoundTemplate的正确位置。

在示例中,我将url存储在会话对象中,以便我可以获取它并重定向用户成功登录到他们尝试访问的路由,但最初我使用了this.redirect(' auth' )重定向到单独的登录路线 - 这只是个人偏好。但是我觉得这很有用所以我把它保存在代码中。

Router.onBeforeAction(function () {

    if(!Meteor.user() && !Meteor.loggingIn()){

        Session.set('returnUrl', Router.current().url);
        this.render('auth');

   } else {
       this.next();
   }

}, {except: ['auth']});


Router.route('/auth', function () {
    this.render('auth');
});

Router.route('/(.*)',function(){
    this.render('notFoundTemplate');
    });

<强>更新

关于闪烁,我添加了!Meteor.loggingIn()检查。我还清理了一些代码并使用了&#39;除了&#39;参数,以避免在身份验证路线上运行onBeforeAction,但由于你不需要它,只需删除它。