检查 Meteor.user() 之前的一切,不仅是有效的路线

Check Meteor.user() prior to everything not only valid Routes

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

此外,我在 Router.configure() 中设置了我的基本布局模板、loadingTemplate 和 notFoundTemplate,据我所知,它为每个没有定义其他内容的路由设置了默认值。

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

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

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

基本上,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() 检查。我还稍微清理了代码并使用 'except' 参数来避免 运行 auth 路由上的 onBeforeAction,但由于您不需要它,只需删除它即可。