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).*$/
.