You can nest routers to create hierarchical URL structures. This is useful for versioned APIs (/api/v1/...) or resource-based grouping. Express also supports route-level parameters that parent routers pass down to child routers.
Node.js
Beginner
9 min read
Route Groups and Nested Routers
Example
// routes/api/v1/index.js
const express = require('express');
const router = express.Router();
const userRouter = require('./users');
const productRouter = require('./products');
router.use('/users', userRouter);
router.use('/products', productRouter);
module.exports = router;
// app.js — versioned API
const express = require('express');
const app = express();
const v1 = require('./routes/api/v1');
const v2 = require('./routes/api/v2');
app.use(express.json());
app.use('/api/v1', v1);
app.use('/api/v2', v2);
// Resulting endpoints:
// GET /api/v1/users
// POST /api/v1/users
// GET /api/v1/products
// GET /api/v2/users (different logic)
// Passing router params to child routers:
// mergeParams: true lets the child see :userId from parent
const commentRouter = express.Router({ mergeParams: true });
commentRouter.get('/', (req, res) => {
res.json({ userId: req.params.userId, comments: [] });
});
// Mount with param:
// router.use('/:userId/comments', commentRouter);
app.listen(3000, () => console.log('Versioned API on port 3000'));