如何优化Express.js路由?

时间:2011-08-13 22:36:37

标签: node.js routes express

我正在开发一个保留区域,其中包含以下几页:

/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它应该是一个问题。)

谢谢

2 个答案:

答案 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, {})     
    });
});