如何优化Express.js路由?

Bla*_*ck2 4 routes node.js express

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

/dashboard
/dashboard/profile
/dashboard/user
/dashboard/view
Run Code Online (Sandbox Code Playgroud)

这是一个简单的用户控制面板.目前我有四条路线:

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 */ }); 
Run Code Online (Sandbox Code Playgroud)

我想优化它,因为在上面的每一条路线中我都必须在开头调用这个函数:

authorized(req, function(auth){
   if (!auth) return next(errors.fire(403));
   /* route code */
});
Run Code Online (Sandbox Code Playgroud)

此函数检查用户是否已记录,因此我需要在每个保留页面上调用它.

我会做的事情如下:

app.all('/dashboard/*', function(req, res, next) { 

    authorized(req, function(auth){
       if (!auth) return next(errors.fire(403));           
       res.render(something, {})     
    });

});
Run Code Online (Sandbox Code Playgroud)

something该res.render调用内部必须是我需要打开视图(页).

我想打电话给它一周时间,以删除冗余代码.

这可能是面板的主页(如果用户需要/仪表板)或页面(如果用户想要一个页面/仪表板如/ dashboard/profile),在最后一种情况下我需要渲染"profile"视图.

(我必须在将视图传递给render()之前进行检查,因为如果有人尝试/ dashboard/blablablabla它应该是一个问题.)

谢谢

Leo*_*spo 7

您可以将该功能作为路由中间件传递给每个路由,请查看http://expressjs.com/guide.html#route-middleware以获取更多信息.这个想法是这样的:

function mustBeAuthorized(req, res, next){
  /* Your code needed to authorize a user */
}
Run Code Online (Sandbox Code Playgroud)

然后在每条路线:

app.all('/dashboard', mustBeAuthorized, function(req, res, next) { /* Code */ }); 
Run Code Online (Sandbox Code Playgroud)

或者,如果您的逻辑依赖于每个路由的某个角色,您可以像这样制作路由中间件:

function mustBeAuthorizedFor(role){
  return function(req, res, next){
     /* Your code needed to authorize a user with that ROLE */
  };
}
Run Code Online (Sandbox Code Playgroud)

然后立即打电话:

app.all('/dashboard', mustBeAuthorizedFor('dashboard'), function(req, res, next) { /* Code */ }); 
Run Code Online (Sandbox Code Playgroud)