What is Express router and how to use it for modular routing?
Express Router
express.Router() is a mini Express application that handles only routing and middleware. It lets you split your routes into separate files, keeping your codebase modular and maintainable.
The Problem Without Router
js
// app.js — everything in one file (bad for large apps)
app.get('/users', ...)
app.post('/users', ...)
app.get('/users/:id', ...)
app.get('/products', ...)
app.post('/products', ...)
// hundreds of routes...Solution: Express Router
src/
app.js
routes/
users.routes.js
products.routes.js
auth.routes.js
controllers/
users.controller.jsCreating a Router
js
// routes/users.routes.js
const express = require('express');
const router = express.Router();
// Routes are relative to the mount point
router.get('/', (req, res) => {
res.json({ users: [] });
});
router.get('/:id', (req, res) => {
res.json({ id: req.params.id });
});
router.post('/', (req, res) => {
res.status(201).json({ created: req.body });
});
router.put('/:id', (req, res) => {
res.json({ updated: req.params.id });
});
router.delete('/:id', (req, res) => {
res.status(204).send();
});
module.exports = router;Mounting the Router
js
// app.js
const express = require('express');
const usersRouter = require('./routes/users.routes');
const productsRouter = require('./routes/products.routes');
const authRouter = require('./routes/auth.routes');
const app = express();
app.use(express.json());
// Mount routers at prefixes
app.use('/api/v1/users', usersRouter);
app.use('/api/v1/products', productsRouter);
app.use('/api/v1/auth', authRouter);
// GET /api/v1/users → usersRouter GET /
// GET /api/v1/users/42 → usersRouter GET /:id
// POST /api/v1/users → usersRouter POST /
app.listen(3000);Router-Level Middleware
js
// routes/admin.routes.js
const express = require('express');
const router = express.Router();
const { requireAdmin } = require('../middleware/auth');
// Apply middleware to ALL routes in this router
router.use(requireAdmin);
router.get('/users', getAllUsers);
router.delete('/users/:id', deleteUser);
module.exports = router;Chained Route Handlers (.route())
js
router.route('/users/:id')
.get(getUser)
.put(updateUser)
.patch(patchUser)
.delete(deleteUser);
// Cleaner than repeating router.get, router.put, etc.Router with Controller Pattern
js
// controllers/users.controller.js
const getUsers = (req, res) => res.json({ users: [] });
const getUser = (req, res) => res.json({ id: req.params.id });
const createUser = (req, res) => res.status(201).json(req.body);
module.exports = { getUsers, getUser, createUser };
// routes/users.routes.js
const { getUsers, getUser, createUser } = require('../controllers/users.controller');
const router = express.Router();
router.get('/', getUsers);
router.get('/:id', getUser);
router.post('/', createUser);
module.exports = router;Summary
Express Router is the key to scalable Express apps. Each router is a self-contained module for a feature area. Mount routers with app.use(prefix, router) to build clean, maintainable route hierarchies.
Short Answer
Interview readyPremium
A concise answer to help you respond confidently on this topic during an interview.