Express.js Framework Cheat Sheet

Quick reference guide for Express.js: Routing, middleware pipeline, request/response API, error handling, and Router modularization.

Languages
express
nodejs
backend

Express.js is a minimal and flexible Node.js web application framework providing a robust set of features for web and mobile applications.

Express App Setup & Basic Routes

typescript
import express, { Request, Response, NextFunction } from "express";

const app = express();

// Parse JSON body & URL-encoded data
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// GET Route with query params
app.get("/api/users", (req: Request, res: Response) => {
  const page = parseInt(req.query.page as string) || 1;
  res.status(200).json({ page, users: [] });
});

// POST Route with body payload
app.post("/api/users", (req: Request, res: Response) => {
  const { name, email } = req.body;
  res.status(201).json({ id: "123", name, email });
});

app.listen(3000, () => console.log("Server listening on port 3000"));

Request & Response API Summary

Table
Property / MethodExample UsageDescription
req.paramsreq.params.idRoute URL parameters (/users/:id)
req.queryreq.query.searchURL query string key-values (?search=val)
req.bodyreq.body.nameParsed request payload body
req.headersreq.headers['authorization']Request HTTP headers object
res.status(code)res.status(404)Set HTTP response status code
res.json(obj)res.json({ ok: true })Send JSON response payload
res.setHeader(k, v)res.setHeader('Cache-Control', 'no-cache')Set custom response HTTP header
res.redirect(url)res.redirect('/login')Redirect HTTP request

Middleware Pipeline & Custom Middleware

Middleware functions execute sequentially in the order they are mounted via app.use().

typescript
// Custom Logger Middleware
const requestLogger = (req: Request, res: Response, next: NextFunction) => {
  console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
  next(); // Pass control to next handler in stack
};

// Custom Auth Middleware
const requireAuth = (req: Request, res: Response, next: NextFunction) => {
  const authHeader = req.headers.authorization;
  if (!authHeader || !authHeader.startsWith("Bearer ")) {
    return res.status(401).json({ error: "Unauthorized access" });
  }
  next();
};

app.use(requestLogger);
app.get("/api/protected", requireAuth, (req, res) => {
  res.json({ message: "Secret data" });
});

Modular Express Router

Split large applications into dedicated, modular router sub-files.

typescript
// routes/products.ts
import { Router } from "express";

const router = Router();

router.get("/", (req, res) => {
  res.json({ products: [] });
});

router.get("/:id", (req, res) => {
  res.json({ id: req.params.id });
});

export default router;

// app.ts
import productRoutes from "./routes/products";
app.use("/api/products", productRoutes);

Error Handling Middleware

Express error middleware accepts 4 arguments: (err, req, res, next).

typescript
app.use((err: Error, req: Request, res: Response, next: NextFunction) => {
  console.error("Unhandled Exception:", err.stack);
  res.status(500).json({ error: err.message || "Internal Server Error" });
});

Common Pitfalls & Tips

[!WARNING] Always call next() inside custom middleware, or return a response with res.send() / res.json(). Forgetting both leaves the HTTP request hanging indefinitely!

[!TIP] Place error-handling middleware at the very bottom of your middleware stack, after all route definitions.