2013-04-12 3 views
4

Я пытаюсь добавить аутентификации промежуточного уровня, которые должны предотвратить доступ к части сайта:порядка управления экспресса/подключение промежуточного

app = express() 
    .get('/api/test', function (req, res) { ... }) 
    .use('/api', function (req, res, next) { 
     if (req.param('key')) { 
      next(); 
     } else { 
      res.json(401, { 
       message : 'Authentication failed' 
      }); 
      res.end(); 
     } 
    }) 
    .get('/api/data', function (req, res) { ... }); 

И мое ожидание, что вызовы/API/данные будут первый обработанном с помощью проверки ключа, а затем (если он будет успешным) обработчиком/api/data. Но вместо этого запрос сначала обрабатывается «/ api/data».

Кажется, что checker работает для/api/something_that_does_not_exist, но не для/api/something_that_exist.

Возможно, я пропустил что-то в документации для экспресс-связи?

Обновление Я проследил это до того, что первый вызов get/post инициализирует промежуточное ПО маршрутизатора, поэтому он выполняется первым.

+1

Он должен работать, и это происходит, когда я проверяю его (с помощью Express 3.1.1). – robertklep

+0

Спасибо. Пример кода - это отрывок из фактического кода и отсутствующий важный фрагмент, который я добавил в некоторые маршруты. _before_ this specific .use –

+0

А я просто заметил, что вы уже выяснили, что это промежуточное ПО маршрутизатора, на которое я тоже ответил :) Если вы «Все в порядке, я просто оставлю ответ« как есть », может помочь кому-то еще в будущем. – robertklep

ответ

5

Как только вы объявляете маршрут, Express вставляет промежуточное ПО router в стек промежуточного программного обеспечения в этот момент при настройке приложения.

В вашем случае, потому что вы вставляете .get('/api/test', ...), прежде чем вставить ключ проверки промежуточного уровня, маршрутизатор промежуточного Вставляется и будет иметь приоритет (также для /api/data маршрута вы объявляете позже) и для ключей проверки никогда не вызывается.

Вот два решения:

// separate middleware, used for all routes that need checking 
var keyChecker = function(req, res, next) { 
    ... 
}; 
app.get('/api/test', function(req, res) { ... }); 
app.get('/api/data', keyChecker, function(req, res) { ... }); 

// or, as an alternative, create a 'catch-all' route between the routes that don't 
// need to be checked, and the ones that should; this will also match non-existing 
// routes (like '/api/foobar'), which might or might not be an issue; 
app.get('/api/test', function(req, res) { ... }); 
app.all('/api/*', function(req, res, next) { // 'all' means 'all methods' 
    // keychecker code 
}); 
app.get('/api/data', function(req, res) { ... }); 

Третье решение может быть явно проверить /api/test в ключе проверки самого промежуточного слоя (req.path === '/api/test'), а просто позвонить next(), если оно соответствует.

Смежные вопросы