Exclude route from express middleware
Even though there is no build-in middleware filter system in expressjs, you can achieve this in at least two ways.
First method is to mount all middlewares that you want to skip to a regular expression path than includes a negative lookup:
// Skip all middleware except rateLimiter and proxy when route is /example_routeapp.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);
Second method, probably more readable and cleaner one, is to wrap your middleware with a small helper function:
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);
If you need more powerfull route matching than simple path === req.path
you can use path-to-regexp module that is used internally by Express.
UPDATE :- In express 4.17
req.path
returns only '/', so use req.baseUrl
:
var unless = function(path, middleware) { return function(req, res, next) { if (path === req.baseUrl) { return next(); } else { return middleware(req, res, next); } };};
Built upon the answer from @lukaszfiszer as I wanted more than one route excluded.You can add as many as you want here.
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"));
Can't add as comment sorry.
You can also skip route like this by putting a condition on req.originalUrl:
app.use(function (req, res, next) { if (req.originalUrl === '/api/login') { return next(); } else { //DO SOMETHING }