Express.js Framework Cheat Sheet
Quick reference guide for Express.js: Routing, middleware pipeline, request/response API, error handling, and Router modularization.
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
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
| Property / Method | Example Usage | Description |
|---|---|---|
req.params | req.params.id | Route URL parameters (/users/:id) |
req.query | req.query.search | URL query string key-values (?search=val) |
req.body | req.body.name | Parsed request payload body |
req.headers | req.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().
// 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.
// 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).
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 withres.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.