Search code examples
node.jsroutesexpressmiddleware

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


I am using the Express framework in node.js with some middleware functions:

var app = express.createServer(options);
app.use(User.checkUser);

I can use the .use function with an additional parameter to use this middleware only on specific paths:

app.use('/userdata', User.checkUser);

Is it possible to use the path variable so that the middleware is used for all paths except a specific one, i.e. the root path?

I am thinking about something like this:

app.use('!/', User.checkUser);

So User.checkUser is always called except for the root path.


Solution

  • 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();
    }