Как оптимизировать маршрут Express.js? - PullRequest
4 голосов
/ 14 августа 2011

Я разрабатываю зарезервированную область, которая имеет следующие несколько страниц:

/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 */
});

ThisФункция проверяет, зарегистрирован ли пользователь, поэтому мне нужно вызывать его на каждой зарезервированной странице.

Я бы сделал что-то вроде:

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

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

});

something внутри вызова res.renderдолжен быть вид (страница) мне нужно открыть.

Я хочу назвать это ОДИН раз, чтобы удалить избыточный код.

Это может быть домашняя страница панели (если пользователь хочет / панель инструментов) или страница(если пользователь хочет страницу внутри / приборной панели, как / приборная панель / профиль), в последнем случае мне нужно визуализировать представление «профиль».

(я должен сделать проверку перед передачей представления для render ()потому что, если кто-то попробует / dashboard / blablablabla, это должно быть проблемой.)

Спасибо

Ответы [ 2 ]

7 голосов
/ 14 августа 2011

Вы можете передать эту функцию каждому маршруту в качестве промежуточного программного обеспечения маршрута, проверьте 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 */ }); 
2 голосов
/ 14 августа 2011

Не правда ли:

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, {})     
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...