2014-11-25 3 views
14

У меня есть приложение узла сидит как брандмауэр/диспетчер перед другими микро услуг и использует промежуточную цепь, как показано ниже:Исключить маршрут от экспресса промежуточного

... 
app.use app_lookup 
app.use timestamp_validator 
app.use request_body 
app.use checksum_validator 
app.use rateLimiter 
app.use whitelist 
app.use proxy 
... 

Однако для конкретного GET маршрута я хочу пропустите все, кроме rateLimiter и прокси. Их способ установить фильтр, например Rails before_filter, используя: except /: only?

+3

Для этой цели вы можете использовать выражение «если только» npm. –

ответ

41

Несмотря на то, что в expressjs нет встроенной системы фильтров промежуточного программного обеспечения, вы можете достичь этого, по крайней мере, двумя способами.

Первый способ смонтировать все промежуточное программное что вы хотите, чтобы перейти к обычному пути выражения, чем включает в себя отрицательный поиск:

// Skip all middleware except rateLimiter and proxy when route is /example_route 
app.use(/\/((?!example_route).)*/, app_lookup); 
app.use(/\/((?!example_route).)*/, timestamp_validator); 
app.use(/\/((?!example_route).)*/, request_body); 
app.use(/\/((?!example_route).)*/, checksum_validator); 
app.use(rateLimiter); 
app.use(/\/((?!example_route).)*/, whitelist); 
app.use(proxy); 

Второй метод, вероятно, более удобным для чтения и чище один, чтобы обернуть промежуточное программное обеспечение с небольшая вспомогательная функция:

var unless = function(path, middleware) { 
    return function(req, res, next) { 
     if (path === req.path) { 
      return next(); 
     } else { 
      return middleware(req, res, next); 
     } 
    }; 
}; 

app.use(unless('/example_route', app_lookup)); 
app.use(unless('/example_route', timestamp_validator)); 
app.use(unless('/example_route', request_body)); 
app.use(unless('/example_route', checksum_validator)); 
app.use(rateLimiter); 
app.use(unless('/example_route', whitelist)); 
app.use(proxy); 

Если вам нужно более мощное согласование маршрута, чем простой path === req.path вы можете использовать path-to-regexp module, который используется внутри Express.

+0

Удобная, но простая функция. Благодаря! –

7

Вы также можете пропустить маршрут, как это, поставив условие на req.originalUrl:

app.use(function (req, res, next) { 

    if (req.originalUrl === '/api/login') { 
    return next(); 
    } else { 
     //DO SOMETHING 
    } 
3

Я использую это регулярное выражение с успехом: /^\/(?!path1|pathn).*$/.

1

Вы можете определить некоторые маршруты, как показано ниже.

app.use(/\/((?!route1|route2).)*/, (req, res, next) => { 

    //A personal middleware 
    //code 

    next();//Will call the app.get(), app.post() or other 
}); 
+0

Здравствуйте, пожалуйста, добавьте некоторое объяснение в свой ответ, а также форматирование кода. Дополнительную информацию см. На странице https://stackoverflow.com/help/formatting. – Chaithanya

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