Skip to main content
Practice Problems

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.js

Creating 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 ready
Premium

A concise answer to help you respond confidently on this topic during an interview.

Finished reading?
Practice Problems