We need to understand how Express Router works and create our own routers. Think of Express Router like creating a blueprint for a section of a building - it defines how different rooms (routes) are connected and what happens in each one. Our tasks are:
1. Analyze an existing router (people.js) to understand its endpoints
2. Create a new router for colors with specific endpoints
3. Understand how routers connect to the main application
Let's analyze how the people router's endpoints are constructed. Remember that the router is mounted at '/people', so we need to combine this base path with each route's path.
// In app.js
app.use('/people', peopleRouter);
// This means all routes in peopleRouter will be prefixed with '/people'
// Let's map each route to its final endpoint:
router.get("/")
→ GET /people
router.post("/:personId/likes")
→ POST /people/:personId/likes
router.delete("/:personId")
→ DELETE /people/:personId
router.get("/best-dressed/comments")
→ GET /people/best-dressed/comments
router.get("/people/:name/lookup")
→ GET /people/people/:name/lookup
Now let's implement our own router for colors. Think of this like creating a new wing in our building specifically for handling color-related requests.
// colors.js
const express = require('express');
const router = express.Router();
// Route to get all colors
router.get('/', (req, res) => {
res.json('GET /colors');
});
// Route to get specific color
router.get('/:name', (req, res) => {
res.json('GET /colors/:name');
});
// Bonus: Additional routes for CSS styles
router.post('/:name/css-styles', (req, res) => {
res.json('POST /colors/:name/css-styles');
});
router.delete('/:name/css-styles/:style', (req, res) => {
res.json('DELETE /colors/:name/css-styles/:style');
});
module.exports = router;
// In app.js
const colorsRouter = require('./routes/colors');
app.use('/colors', colorsRouter);
Route parameters (like :name or :style) are like variables in our URL path. They can capture different values:
// Examples of how :name parameter works:
GET /colors/red → :name is 'red'
GET /colors/blue → :name is 'blue'
GET /colors/purple → :name is 'purple'
// For nested parameters:
DELETE /colors/red/css-styles/background
→ :name is 'red', :style is 'background'
Express Router is commonly used in real-world applications for:
1. API versioning (e.g., /api/v1/users, /api/v2/users)
2. Resource management (e.g., /products, /orders, /users)
3. Feature modules (e.g., /auth, /admin, /dashboard)
4. Microservices routing
// Example of a well-organized router structure
project/
├── routes/
│ ├── index.js // Main router hub
│ ├── colors.js // Colors routes
│ ├── auth.js // Authentication routes
│ └── api/ // API routes folder
│ ├── v1/ // API version 1
│ └── v2/ // API version 2
Express Router offers several advanced features:
// Router-level middleware
router.use((req, res, next) => {
console.log('Time:', Date.now());
next();
});
// Multiple middleware in a route
router.get('/:name',
validateColor, // First middleware
checkPermissions, // Second middleware
(req, res) => { // Final handler
res.json('GET /colors/:name');
}
);
When testing your router implementation, verify:
1. Base routes work correctly (GET /colors)
2. Parameter routes capture values correctly (GET /colors/red)
3. Nested routes maintain proper hierarchy
4. Error cases are handled appropriately
Think of router testing like doing a walkthrough of a building - you want to make sure all the doors (endpoints) open correctly and lead to the right rooms (handlers).