我正在开发一个保留区域,其中包含以下几页:
/dashboard
/dashboard/profile
/dashboard/user
/dashboard/view
这是一个简单的用户控制面板。目前我有四条路线:
app.all('/dashboard', function(req, res, next) { /* Code */ });
app.all('/dashboard/profile', function(req, res, next) { /* Code */ });
app.all('/dashboard/user', function(req, res, next) { /* Code */ });
app.all('/dashboard/view', function(req, res, next) { /* Code */ });
我想优化它,因为在上述每条路线中我都必须在开头调用此功能:
authorized(req, function(auth){
if (!auth) return next(errors.fire(403));
/* route code */
});
此功能检查用户是否已登录,因此我需要在每个保留页面上调用它。
我会做类似的事情:
app.all('/dashboard/*', function(req, res, next) {
authorized(req, function(auth){
if (!auth) return next(errors.fire(403));
res.render(something, {})
});
});
res.render调用中的something
必须是我需要打开的视图(页面)。
我想将其称为 ONE 时间,以删除冗余代码。
在最后一种情况下,我可能需要渲染“个人资料”视图,这可能是面板的主页(如果用户想要/仪表板)或页面(如果用户想要一个页面/仪表板如/ dashboard / profile)
(我必须在将视图传递给render()之前进行检查,因为如果有人尝试/ dashboard / blablablabla它应该是一个问题。)
谢谢
答案 0 :(得分:7)
您可以将该功能作为路由中间件传递给每个路由,请查看http://expressjs.com/guide.html#route-middleware以获取更多信息。这个想法是这样的:
function mustBeAuthorized(req, res, next){
/* Your code needed to authorize a user */
}
然后在每条路线中:
app.all('/dashboard', mustBeAuthorized, function(req, res, next) { /* Code */ });
或者,如果您的逻辑依赖于每个路由的某个角色,您可以像这样制作路由中间件:
function mustBeAuthorizedFor(role){
return function(req, res, next){
/* Your code needed to authorize a user with that ROLE */
};
}
然后马上打电话:
app.all('/dashboard', mustBeAuthorizedFor('dashboard'), function(req, res, next) { /* Code */ });
答案 1 :(得分:2)
不是吗:
app.get('/dashboard/:page?', function(req, res, next){
var page = req.params.page;
if ( ! page) {
page = "dash-index"
}
authorized(req, function(auth){
if (!auth) return next(errors.fire(403));
res.render(page, {})
});
});