javascript node.js express coffeescript middleware

javascript - Excluir ruta desde el middleware expreso



node.js express (5)

Tengo una aplicación de nodo como un servidor de seguridad / despachador frente a otros servicios micro y utiliza una cadena de middleware como la siguiente:

... 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 ...

Sin embargo, para una ruta GET particular, quiero omitirlos todos, excepto rateLimiter y proxy. ¿Es una forma de configurar un filtro como un Rails before_filter usando: except /: only?


Basado en la respuesta de @lukaszfiszer, ya que quería que se excluyera más de una ruta. Puedes agregar tantas como quieras aquí.

var unless = function(middleware, ...paths) { return function(req, res, next) { const pathCheck = paths.some(path => path === req.path); pathCheck ? next() : middleware(req, res, next); }; }; app.use(unless(redirectPage, "/user/login", "/user/register"));

No se puede agregar como comentario lo siento.


Puede definir algunas rutas como a continuación.

app.use(///((?!route1|route2).)*/, (req, res, next) => { //A personal middleware //code next();//Will call the app.get(), app.post() or other });


Si bien no hay un sistema de filtro de middleware incorporado en Expressjs, puede lograrlo al menos de dos maneras.

El primer método es montar todos los middlewares que desea saltar a una ruta de expresión regular que incluya una búsqueda negativa:

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

El segundo método, probablemente más legible y más limpio, es envolver su middleware con una pequeña función auxiliar:

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);

Si necesita una correspondencia de rutas más potente que la ruta simple path === req.path , puede utilizar el módulo de path === req.path que Express usa internamente.


También puede omitir una ruta como esta poniendo una condición en req.originalUrl:

app.use(function (req, res, next) { if (req.originalUrl === ''/api/login'') { return next(); } else { //DO SOMETHING }


Utilizo esta expresión regular con éxito: /^//(?!path1|pathn).*$/ .