- Spec files
npm-express
Describes: pkg:npm/express@4.21.x
- Description
- Fast, unopinionated, minimalist web framework for Node.js
- Author
- tessl
- Last updated
router.md docs/
1# Router System23Modular route handlers for organizing and grouping related routes with middleware support, enabling clean separation of concerns in large applications.45## Capabilities67### Router Creation89Create router instances for modular route organization and middleware mounting.1011```javascript { .api }12/**13* Create router instance for modular route handlers14* @param {RouterOptions} [options] - Router configuration options15* @returns {Router} Router instance with routing capabilities16*/17function Router(options?: RouterOptions): Router;1819/**20* Router configuration options21*/22interface RouterOptions {23/** Enable case-sensitive routing (default: false) */24caseSensitive?: boolean;25/** Merge parameters from parent router (default: false) */26mergeParams?: boolean;27/** Enable strict routing (trailing slash matters) (default: false) */28strict?: boolean;29}3031/**32* Access Router constructor via express.Router33*/34declare const express: {35Router(options?: RouterOptions): Router;36};37```3839**Usage Examples:**4041```javascript42const express = require('express');4344// Basic router creation45const userRouter = express.Router();4647// Router with options48const apiRouter = express.Router({49caseSensitive: true,50strict: true51});5253// Router with merged params (access parent route params)54const postRouter = express.Router({ mergeParams: true });5556// Mount routers on main app57const app = express();58app.use('/users', userRouter);59app.use('/api/v1', apiRouter);60app.use('/users/:userId/posts', postRouter);61```6263### Router Middleware6465Mount middleware functions on router instances for request processing.6667```javascript { .api }68/**69* Router instance with middleware and routing capabilities70*/71interface Router {72/**73* Mount middleware function(s) at optional path74* @param {string} [path] - Optional path to mount middleware (default: '/')75* @param {...RequestHandler} handlers - Middleware function(s) to mount76* @returns {Router} Router instance for chaining77*/78use(path?: string, ...handlers: RequestHandler[]): Router;7980/**81* Add parameter middleware for route parameters82* @param {string} name - Parameter name to trigger on83* @param {ParamHandler} handler - Parameter handler function84* @returns {Router} Router instance for chaining85*/86param(name: string, handler: ParamHandler): Router;87}88```8990**Usage Examples:**9192```javascript93const userRouter = express.Router();9495// Router-level middleware (applies to all routes in this router)96userRouter.use((req, res, next) => {97console.log('User router middleware');98req.startTime = Date.now();99next();100});101102// Path-specific middleware within router103userRouter.use('/profile', authenticateUser, (req, res, next) => {104req.isProfileRoute = true;105next();106});107108// Parameter middleware for router109userRouter.param('id', (req, res, next, id) => {110// Load user and attach to request111User.findById(id, (err, user) => {112if (err) return next(err);113if (!user) return next(new Error('User not found'));114req.user = user;115next();116});117});118119// Multiple middleware functions120userRouter.use(121authenticateUser,122authorizeUser,123logUserAccess124);125126function authenticateUser(req, res, next) {127// Authentication logic128next();129}130131function authorizeUser(req, res, next) {132// Authorization logic133next();134}135136function logUserAccess(req, res, next) {137console.log(`User ${req.user.id} accessed ${req.path}`);138next();139}140```141142### Router HTTP Methods143144Handle HTTP methods within router instances for organized route definition.145146```javascript { .api }147/**148* Router HTTP method handlers149*/150interface Router {151/** Handle GET requests */152get(path: string, ...handlers: RequestHandler[]): Router;153/** Handle POST requests */154post(path: string, ...handlers: RequestHandler[]): Router;155/** Handle PUT requests */156put(path: string, ...handlers: RequestHandler[]): Router;157/** Handle DELETE requests */158delete(path: string, ...handlers: RequestHandler[]): Router;159/** Handle PATCH requests */160patch(path: string, ...handlers: RequestHandler[]): Router;161/** Handle HEAD requests */162head(path: string, ...handlers: RequestHandler[]): Router;163/** Handle OPTIONS requests */164options(path: string, ...handlers: RequestHandler[]): Router;165/** Handle all HTTP methods */166all(path: string, ...handlers: RequestHandler[]): Router;167}168```169170**Usage Examples:**171172```javascript173const userRouter = express.Router();174175// GET routes176userRouter.get('/', (req, res) => {177res.json({ message: 'Get all users' });178});179180userRouter.get('/:id', (req, res) => {181// req.user is available from param middleware182res.json(req.user);183});184185// POST routes186userRouter.post('/', validateUserData, (req, res) => {187const user = createUser(req.body);188res.status(201).json(user);189});190191// PUT routes192userRouter.put('/:id', validateUserData, (req, res) => {193const updatedUser = updateUser(req.user.id, req.body);194res.json(updatedUser);195});196197// DELETE routes198userRouter.delete('/:id', (req, res) => {199deleteUser(req.user.id);200res.sendStatus(204);201});202203// PATCH routes204userRouter.patch('/:id', (req, res) => {205const patchedUser = patchUser(req.user.id, req.body);206res.json(patchedUser);207});208209// Handle all methods for specific path210userRouter.all('/:id/reset', (req, res) => {211resetUser(req.user.id);212res.json({ message: 'User reset' });213});214215function validateUserData(req, res, next) {216if (!req.body.name) {217return res.status(400).json({ error: 'Name is required' });218}219next();220}221```222223### Router Route Creation224225Create route instances within routers for method chaining and organization.226227```javascript { .api }228/**229* Create route instance for path with chainable method handlers230* @param {string} path - Route path pattern within router231* @returns {Route} Route instance for chaining HTTP methods232*/233router.route(path: string): Route;234235/**236* Route instance with chainable HTTP method handlers237*/238interface Route {239/** Route path pattern */240path: string;241/** HTTP methods handled by this route */242methods: { [method: string]: boolean };243244/** Handle all HTTP methods */245all(...handlers: RequestHandler[]): Route;246/** Handle GET requests */247get(...handlers: RequestHandler[]): Route;248/** Handle POST requests */249post(...handlers: RequestHandler[]): Route;250/** Handle PUT requests */251put(...handlers: RequestHandler[]): Route;252/** Handle DELETE requests */253delete(...handlers: RequestHandler[]): Route;254/** Handle PATCH requests */255patch(...handlers: RequestHandler[]): Route;256}257```258259**Usage Examples:**260261```javascript262const userRouter = express.Router();263264// Method chaining with router route265userRouter.route('/:id')266.all((req, res, next) => {267// Middleware for all methods on this route268console.log(`Accessing user ${req.params.id}`);269next();270})271.get((req, res) => {272res.json(req.user);273})274.put((req, res) => {275const updatedUser = updateUser(req.params.id, req.body);276res.json(updatedUser);277})278.delete((req, res) => {279deleteUser(req.params.id);280res.sendStatus(204);281});282283// Multiple route chains284userRouter.route('/profile')285.get(getProfile)286.post(createProfile)287.put(updateProfile);288289userRouter.route('/settings')290.get(getSettings)291.patch(updateSettings);292293function getProfile(req, res) {294res.json(req.user.profile);295}296297function createProfile(req, res) {298const profile = createUserProfile(req.user.id, req.body);299res.status(201).json(profile);300}301302function updateProfile(req, res) {303const profile = updateUserProfile(req.user.id, req.body);304res.json(profile);305}306```307308### Router Mounting and Nesting309310Mount routers on applications and nest routers within other routers for hierarchical organization.311312```javascript { .api }313/**314* Mount router on application or another router315*/316app.use(path: string, router: Router): Application;317router.use(path: string, childRouter: Router): Router;318```319320**Usage Examples:**321322```javascript323const express = require('express');324const app = express();325326// Create routers for different modules327const userRouter = express.Router();328const postRouter = express.Router();329const commentRouter = express.Router();330331// User routes332userRouter.get('/', getAllUsers);333userRouter.get('/:id', getUser);334userRouter.post('/', createUser);335336// Post routes (nested under users)337postRouter.get('/', getUserPosts);338postRouter.post('/', createUserPost);339postRouter.get('/:postId', getUserPost);340341// Comment routes (nested under posts)342commentRouter.get('/', getPostComments);343commentRouter.post('/', createPostComment);344345// Nest routers346postRouter.use('/:postId/comments', commentRouter);347userRouter.use('/:userId/posts', postRouter);348349// Mount main router on app350app.use('/api/users', userRouter);351352// Resulting URL structure:353// GET /api/users -> getAllUsers354// GET /api/users/123 -> getUser355// GET /api/users/123/posts -> getUserPosts356// GET /api/users/123/posts/456 -> getUserPost357// GET /api/users/123/posts/456/comments -> getPostComments358// POST /api/users/123/posts/456/comments -> createPostComment359360// API versioning with routers361const v1Router = express.Router();362const v2Router = express.Router();363364v1Router.use('/users', userRouter);365v1Router.get('/status', (req, res) => res.json({ version: 'v1' }));366367v2Router.use('/users', userRouter);368v2Router.get('/status', (req, res) => res.json({ version: 'v2' }));369370app.use('/api/v1', v1Router);371app.use('/api/v2', v2Router);372```373374### Router Error Handling375376Handle errors within router instances with error middleware.377378```javascript { .api }379/**380* Error handling middleware signature for routers381* @param {Error} err - Error object382* @param {Request} req - Express request object383* @param {Response} res - Express response object384* @param {NextFunction} next - Next middleware function385*/386type RouterErrorHandler = (err: Error, req: Request, res: Response, next: NextFunction) => void;387```388389**Usage Examples:**390391```javascript392const userRouter = express.Router();393394// Regular routes395userRouter.get('/:id', async (req, res, next) => {396try {397const user = await User.findById(req.params.id);398if (!user) {399const error = new Error('User not found');400error.status = 404;401return next(error);402}403res.json(user);404} catch (error) {405next(error);406}407});408409userRouter.post('/', async (req, res, next) => {410try {411const user = await User.create(req.body);412res.status(201).json(user);413} catch (error) {414next(error);415}416});417418// Router-specific error handler419userRouter.use((err, req, res, next) => {420if (err.name === 'ValidationError') {421return res.status(400).json({422error: 'Validation Error',423details: err.message424});425}426427if (err.status === 404) {428return res.status(404).json({429error: 'User not found'430});431}432433// Pass to application error handler434next(err);435});436437// Mount router438app.use('/api/users', userRouter);439440// Application-level error handler441app.use((err, req, res, next) => {442console.error(err.stack);443res.status(500).json({444error: 'Internal Server Error'445});446});447```448449### Router Organization Patterns450451Common patterns for organizing routes and middleware in large applications.452453**Usage Examples:**454455```javascript456// File: routes/users.js457const express = require('express');458const router = express.Router();459460// Middleware specific to user routes461router.use(authenticateUser);462router.use(validateUserAccess);463464// User CRUD operations465router.get('/', getAllUsers);466router.get('/:id', getUser);467router.post('/', createUser);468router.put('/:id', updateUser);469router.delete('/:id', deleteUser);470471module.exports = router;472473// File: routes/posts.js474const express = require('express');475const router = express.Router({ mergeParams: true });476477router.get('/', getUserPosts);478router.post('/', createUserPost);479router.get('/:postId', getUserPost);480router.put('/:postId', updateUserPost);481router.delete('/:postId', deleteUserPost);482483module.exports = router;484485// File: app.js486const express = require('express');487const userRoutes = require('./routes/users');488const postRoutes = require('./routes/posts');489490const app = express();491492// Mount routes493app.use('/api/users', userRoutes);494app.use('/api/users/:userId/posts', postRoutes);495496// Admin routes with prefix497const adminRouter = express.Router();498adminRouter.use(requireAdmin);499adminRouter.get('/stats', getAdminStats);500adminRouter.get('/logs', getSystemLogs);501app.use('/admin', adminRouter);502503// API versioning504const v1 = express.Router();505const v2 = express.Router();506507v1.use('/users', userRoutes);508v2.use('/users', require('./routes/v2/users'));509510app.use('/api/v1', v1);511app.use('/api/v2', v2);512```513514## Router Properties and Methods515516```javascript { .api }517/**518* Additional router properties and internal methods519*/520interface Router {521/** Handle request (internal routing mechanism) */522handle(req: Request, res: Response, next: NextFunction): void;523524/** Router stack (internal middleware/route storage) */525stack: any[];526}527```528529**Usage Examples:**530531```javascript532const router = express.Router();533534// Custom router middleware to inspect routing535router.use((req, res, next) => {536console.log(`Router handling: ${req.method} ${req.originalUrl}`);537console.log(`Router stack size: ${router.stack.length}`);538next();539});540541// Mount on app542app.use('/api', router);543```