How does routing work in Express, including route parameters and modular routers?

3 minbeginnernodejsexpressroutingparamsrouter

Quick Answer

Routes map an HTTP method + path pattern to handlers. Path segments like /users/:id become req.params; query strings become req.query. express.Router() groups related routes into mountable modules (e.g. all /users routes) for a clean, scalable structure.

Detailed Answer

Answer:

Basic routing — method + path → handler:

app.get('/users', listUsers);
app.post('/users', createUser);
app.put('/users/:id', updateUser);
app.delete('/users/:id', deleteUser);

Route parameters and query strings:

// GET /users/42?fields=name
app.get('/users/:id', (req, res) => {
  req.params.id;         // '42'  (path parameter)
  req.query.fields;      // 'name' (query string)
});

Modular routers — group related routes and mount them:

// routes/users.js
const router = require('express').Router();
router.get('/', listUsers);       // GET /users
router.get('/:id', getUser);      // GET /users/:id
router.post('/', createUser);     // POST /users
module.exports = router;

// app.js
app.use('/users', require('./routes/users'));

This keeps a growing app organized — one router file per resource — and lets you attach router-level middleware (e.g., auth for all /admin routes).

Useful details:

  • Routes are matched in order; put more specific routes before catch-alls.
  • app.route('/users').get(...).post(...) chains methods for one path.
  • Patterns support optional segments and (in Express 4) regex; Express 5 changed some pattern syntax.
  • A final app.use((req, res) => res.status(404).json({error: 'Not found'})) handles unmatched routes.