Node.js6 min read

Express Router for Modular Routes

Organize Express routes with Router. Split your application into manageable, modular pieces.

Sarah Chen
December 19, 2025
0.0k0

Express Router for Modular Routes

As your app grows, routes become messy. Router helps organize them.

The Problem

// 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

// 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;
// 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

// 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;
// routes/products.js
const router = require('express').Router();

router.get('/', (req, res) => res.json([]));

module.exports = router;
// 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

// 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;
// app.js
const routes = require('./routes');
app.use('/api', routes);

Router-Level Middleware

// 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

// 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

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

#Node.js#Express#Router#Organization#Intermediate