Use specific middleware in Express for all paths except a specific one Use specific middleware in Express for all paths except a specific one express express

Use specific middleware in Express for all paths except a specific one


I would add checkUser middleware to all my paths, except homepage.

app.get('/', routes.index);app.get('/account', checkUser, routes.account);

or

app.all('*', checkUser);    function checkUser(req, res, next) {  if ( req.path == '/') return next();  //authenticate user  next();}

You could extend this to search for the req.path in an array of non-authenticated paths:

function checkUser(req, res, next) {  const nonSecurePaths = ['/', '/about', '/contact'];  if (nonSecurePaths.includes(req.path)) return next();  //authenticate user  next();}


Instead of directly registering User.checkUser as middleware, register a new helper function, say checkUserFilter, that gets called on every URL, but passed execution to userFiled` only on given URLs. Example:

var checkUserFilter = function(req, res, next) {    if(req._parsedUrl.pathname === '/') {        next();    } else {        User.checkUser(req, res, next);    }}app.use(checkUserFilter);

In theory, you could provide regexp paths to app.use. For instance something like:

app.use(/^\/.+$/, checkUser);

Tried it on express 3.0.0rc5, but it doesn't work.

Maybe we could open a new ticket and suggest this as a feature?


You can set the middleware on each route also.

// create application/x-www-form-urlencoded parservar urlencodedParser = bodyParser.urlencoded({ extended: false })// POST /login gets urlencoded bodiesapp.post('/login', urlencodedParser, function (req, res) {  if (!req.body) return res.sendStatus(400)  res.send('welcome, ' + req.body.username)})