Express Router for Modular Routes
Organize Express routes with Router. Split your application into manageable, modular pieces.
Express Router for Modular Routes
As your app grows, routes become messy. Router helps organize them.
The Problem
```javascript // All in one file - gets messy fast app.get('/users', ...); app.post('/users', ...); app.get('/users/:id', ...); app.get('/posts', ...); app.post('/posts', ...); app.get('/products', ...); // 100 more routes... ```
The Solution: Router
```javascript // routes/users.js const express = require('express'); const router = express.Router();
router.get('/', (req, res) => { res.json([{ id: 1, name: 'Alice' }]); });
router.get('/:id', (req, res) => { res.json({ id: req.params.id }); });
router.post('/', (req, res) => { res.status(201).json(req.body); });
module.exports = router; ```
```javascript // app.js const express = require('express'); const userRoutes = require('./routes/users');
const app = express(); app.use(express.json());
app.use('/api/users', userRoutes);
app.listen(3000); ```
Project Structure
``` project/ ├── app.js ├── routes/ │ ├── index.js │ ├── users.js │ ├── posts.js │ └── products.js └── package.json ```
Multiple Route Files
```javascript // routes/posts.js const router = require('express').Router();
router.get('/', (req, res) => res.json([])); router.post('/', (req, res) => res.status(201).json(req.body));
module.exports = router; ```
```javascript // routes/products.js const router = require('express').Router();
router.get('/', (req, res) => res.json([]));
module.exports = router; ```
```javascript // app.js const userRoutes = require('./routes/users'); const postRoutes = require('./routes/posts'); const productRoutes = require('./routes/products');
app.use('/api/users', userRoutes); app.use('/api/posts', postRoutes); app.use('/api/products', productRoutes); ```
Router Index File
```javascript // routes/index.js const express = require('express'); const router = express.Router();
router.use('/users', require('./users')); router.use('/posts', require('./posts')); router.use('/products', require('./products'));
module.exports = router; ```
```javascript // app.js const routes = require('./routes'); app.use('/api', routes); ```
Router-Level Middleware
```javascript // routes/admin.js const router = require('express').Router();
// Middleware for all admin routes router.use((req, res, next) => { if (!req.user?.isAdmin) { return res.status(403).json({ error: 'Admin only' }); } next(); });
router.get('/stats', (req, res) => res.json({ users: 100 })); router.delete('/users/:id', (req, res) => res.json({ deleted: true }));
module.exports = router; ```
Nested Routes
```javascript // routes/users.js const router = require('express').Router();
router.get('/', (req, res) => res.json([]));
// Nested: /api/users/:userId/posts router.get('/:userId/posts', (req, res) => { const { userId } = req.params; res.json({ userId, posts: [] }); });
module.exports = router; ```
Complete Example
```javascript // routes/users.js const express = require('express'); const router = express.Router();
let users = [{ id: 1, name: 'Alice' }];
router.get('/', (req, res) => { res.json(users); });
router.get('/:id', (req, res) => { const user = users.find(u => u.id === +req.params.id); if (!user) return res.status(404).json({ error: 'Not found' }); res.json(user); });
router.post('/', (req, res) => { const user = { id: users.length + 1, ...req.body }; users.push(user); res.status(201).json(user); });
router.delete('/:id', (req, res) => { users = users.filter(u => u.id !== +req.params.id); res.status(204).send(); });
module.exports = router; ```
Key Takeaway
Use `express.Router()` to split routes into separate files. Mount them with `app.use('/path', router)`. Keeps your code organized as your app grows. Each router is a mini Express app for its routes.