Express.js Framework
Building web applications with Express
Challenge
Section titled “Challenge”Build scalable, maintainable web applications with Express framework.
Explanation
Section titled “Explanation”Express is the most popular Node.js web framework, providing routing, middleware, and utilities for HTTP server development.
Basic Setup
Section titled “Basic Setup”const express = require('express');const app = express();
// Middlewareapp.use(express.json());app.use(express.urlencoded({ extended: true }));
// Basic routeapp.get('/', (req, res) => { res.json({ message: 'Hello World' });});
// Listenconst PORT = process.env.PORT || 3000;app.listen(PORT, () => { console.log(`Server running on port ${PORT}`);});Routing
Section titled “Routing”// HTTP methodsapp.get('/users', (req, res) => { res.json({ users: [] });});
app.post('/users', (req, res) => { const user = req.body; res.status(201).json(user);});
app.put('/users/:id', (req, res) => { const { id } = req.params; res.json({ id, ...req.body });});
app.delete('/users/:id', (req, res) => { res.json({ message: 'Deleted' });});
// Route parametersapp.get('/users/:id', (req, res) => { const { id } = req.params; res.json({ id });});
// Query parametersapp.get('/search', (req, res) => { const { q, limit } = req.query; res.json({ query: q, limit });});
// Route groups with routerconst userRouter = express.Router();
userRouter.get('/', (req, res) => { res.json({ users: [] });});
userRouter.get('/:id', (req, res) => { res.json({ id: req.params.id });});
app.use('/api/users', userRouter);Middleware
Section titled “Middleware”// Custom middlewarefunction requestLogger(req, res, next) { console.log(`${req.method} ${req.path}`); next();}
app.use(requestLogger);
// Middleware with error handlingfunction authenticate(req, res, next) { const token = req.headers['authorization']; if (!token) { return res.status(401).json({ error: 'No token' }); } req.user = { id: 1 }; // Verify token... next();}
app.get('/protected', authenticate, (req, res) => { res.json({ message: 'Protected', user: req.user });});
// Conditional middlewareapp.get('/admin', authenticate, (req, res) => { // Only runs if authenticate passes});Error Handling
Section titled “Error Handling”// Route not foundapp.use((req, res) => { res.status(404).json({ error: 'Not found' });});
// Error middleware (must have 4 parameters!)app.use((error, req, res, next) => { console.error(error); res.status(error.status || 500).json({ error: error.message });});
// Usageapp.get('/divide', (req, res, next) => { try { const { a, b } = req.query; if (b === 0) { throw new Error('Division by zero'); } res.json({ result: a / b }); } catch (error) { next(error); // Pass to error middleware }});Request/Response
Section titled “Request/Response”// Requestapp.post('/users', (req, res) => { const { name, email } = req.body; const contentType = req.get('content-type'); const userAgent = req.get('user-agent');
console.log(req.method); // POST console.log(req.path); // /users console.log(req.headers); // All headers console.log(req.params); // URL parameters console.log(req.query); // Query string console.log(req.body); // Parsed body});
// Responseapp.get('/users', (req, res) => { res.status(200); // Status code res.json({ users: [] }); // Send JSON
// Alternative response methods // res.send('Text response'); // res.sendFile('/path/to/file'); // res.redirect('/other-route'); // res.cookie('name', 'value'); // res.set('Custom-Header', 'value');});Validation and Error Handling
Section titled “Validation and Error Handling”const { body, validationResult } = require('express-validator');
app.post('/users', body('email').isEmail(), body('password').isLength({ min: 8 }), body('name').trim().notEmpty(), (req, res) => { const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); }
// Process validated data res.json({ message: 'User created' }); });Static Files
Section titled “Static Files”// Serve static filesapp.use(express.static('public'));app.use('/files', express.static('uploads'));
// Template enginesapp.set('view engine', 'ejs');app.set('views', './views');
app.get('/page', (req, res) => { res.render('index', { title: 'Home', user: 'John' }); // Renders views/index.ejs});Advanced Patterns
Section titled “Advanced Patterns”// Async/await in routesapp.get('/users/:id', async (req, res, next) => { try { const user = await User.findById(req.params.id); if (!user) { return res.status(404).json({ error: 'Not found' }); } res.json(user); } catch (error) { next(error); }});
// Request timeoutapp.use((req, res, next) => { req.setTimeout(30000); // 30 seconds next();});
// Compressionconst compression = require('compression');app.use(compression());
// CORSconst cors = require('cors');app.use(cors());
// Rate limitingconst rateLimit = require('express-rate-limit');const limiter = rateLimit({ windowMs: 15 * 60 * 1000, max: 100 });app.use(limiter);