Lab 11: REST API with Express

Time: 30 minutes | Level: Practitioner | Docker: docker run -it --rm node:20-alpine sh

Overview

Build a complete REST API using Express.js: routing, middleware, express.json(), error handling middleware, and full CRUD endpoints.


Step 1: Setup

# Inside Docker container
mkdir /app && cd /app
npm init -y
npm install express

Step 2: Basic Express Server

// server.js
const express = require('express');
const app = express();

// Built-in middleware
app.use(express.json());           // Parse JSON bodies
app.use(express.urlencoded({ extended: true })); // Parse form data

// Request logging middleware
app.use((req, res, next) => {
  console.log(`${new Date().toISOString()} ${req.method} ${req.path}`);
  next();
});

// Simple route
app.get('/', (req, res) => {
  res.json({ message: 'Hello, Express!', timestamp: new Date().toISOString() });
});

app.listen(3000, () => console.log('Server on :3000'));

💡 Middleware functions have (req, res, next) signature. Call next() to pass to the next middleware/route. Call next(err) to skip to error handler.


Step 3: Router — Organizing Routes


Step 4: Middleware Chain


Step 5: Error Handling Middleware


Step 6: Complete Server Assembly


Step 7: Testing the API


Step 8: Capstone — Inline Demo

📸 Verified Output:


Summary

Express Feature
Code
Purpose

express.json()

app.use(express.json())

Parse JSON request bodies

Route params

req.params.id

/users/:id

Query strings

req.query.filter

/users?role=admin

Router

express.Router()

Modular route grouping

Middleware

(req, res, next) => {}

Auth, logging, validation

Error middleware

(err, req, res, next) => {}

Centralized error handling

Status codes

res.status(201).json({})

HTTP semantics

404 handler

After all routes

Catch unmatched routes

Last updated