Route Parameters and Query Strings
Express makes it easy to capture dynamic values from URLs using route parameters (prefixed with a colon). Query strings are automatically parsed and available on req.query.
Route parameters are used for required, hierarchical data (like user IDs), while query strings are used for optional filters, sorting, and pagination.
Example
const express = require('express');
const app = express();
// Route parameters — capture dynamic segments
app.get('/users/:id', (req, res) => {
const userId = req.params.id;
res.json({ message: `User ${userId} details` });
});
// GET /users/42 → { message: "User 42 details" }
// Multiple parameters
app.get('/posts/:year/:month', (req, res) => {
res.json({
year: req.params.year,
month: req.params.month
});
});
// GET /posts/2025/03 → { year: "2025", month: "03" }
// Query strings — parsed automatically
app.get('/search', (req, res) => {
const { q, page = 1, limit = 10 } = req.query;
res.json({ query: q, page, limit });
});
// GET /search?q=nodejs&page=2 → { query: "nodejs", page: "2", limit: 10 } - req.params — Object containing route parameter values
- req.query — Object containing parsed query string parameters
- :param — Define a route parameter in the path
- Parameters are always strings — convert to numbers if needed
- Default values — Use destructuring defaults for optional query params
Notes
- Route parameter values are always strings. Use parseInt() or Number() to convert them to numbers when needed.
Router Modules for Organization
As your application grows, putting all routes in a single file becomes unmanageable. Express Router lets you split routes into separate modules, each handling a specific resource or feature.
Create a router file for each resource (users, products, posts), define its routes, and mount it on your main app with a prefix.
Example
// 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, name: 'Alice' });
});
router.post('/', (req, res) => {
res.status(201).json({ message: 'User created', data: req.body });
});
module.exports = router;
// app.js — Mount the router
const express = require('express');
const userRoutes = require('./routes/users');
const app = express();
app.use(express.json());
app.use('/api/users', userRoutes); // All routes prefixed with /api/users
app.listen(3000, () => console.log('Server running on port 3000')); Notes
- Convention: create a routes/ folder and a separate file per resource. Mount each router with app.use('/prefix', router).
