我只是设置一个基本的应用程序。我有一个完整的路线和一个onBeforeAction来检查用户是否已登录。如果没有,它会在特殊布局中呈现一个登录模板(使用this.layout())。
此外,我在Router.configure()中有基本的layoutTemplate,loadingTemplate和notFoundTemplate设置,据我所知,为每个没有定义其他内容的Route设置默认值。
基本上一切都有一个例外:对于404事件,onBeforeAction不会被调用。这使得我的404模板在默认布局中呈现。我的目标是即使在不存在的路线上也要进行登录检查。
完成这项工作的最佳方法是什么?
答案 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,但由于你不需要它,只需删除它。