Topic 43 of 55
Express Router Code Separation
Overview
Putting all your routes in a single `server.js` file quickly becomes unmaintainable. The `express.Router` class allows you to create modular, mountable route handlers in separate files, keeping your codebase organized.
Syntax
javascript
// --- 1. Create a router file (routes/users.js) ---
const express = require('express');
const router = express.Router(); // Creates a mini-app
// Note: The path here is relative to where it gets mounted
router.get('/', (req, res) => {
res.send('Get all users');
});
router.post('/', (req, res) => {
res.send('Create a user');
});
module.exports = router;
// --- 2. Mount it in your main server file (app.js) ---
const express = require('express');
const app = express();
const userRoutes = require('./routes/users');
// Any request to /api/users will be routed to the users.js file
app.use('/api/users', userRoutes);
app.listen(3000);Common Pitfalls
- Forgetting to `module.exports = router` at the end of your route file will cause a crash when `app.js` tries to `app.use()` it.
- If you mount a router at `/api/users`, inside the router file you should use `router.get('/')`, NOT `router.get('/api/users')`. The paths combine automatically.
Real-World Example
A standard API folder structure using Routers and Controllers:
example
javascript
project/
├── app.js // Main entry point
├── routes/
│ ├── auth.js // Defines endpoints (router.post('/login'))
│ └── posts.js // Defines endpoints (router.get('/'))
└── controllers/
├── authController.js // Contains the actual logic/functions
└── postsController.js
// Example routes/posts.js:
const express = require('express');
const router = express.Router();
const { getAllPosts, createPost } = require('../controllers/postsController');
router.get('/', getAllPosts);
router.post('/', createPost);
module.exports = router;