E

Express API

Build a type-safe REST API with Express and TypeScript.

Code

typescript
1import express, { Request, Response, NextFunction } from "express";
2
3// Type definitions
4interface User {
5 id: number;
6 name: string;
7 email: string;
8}
9
10interface CreateUserBody {
11 name: string;
12 email: string;
13}
14
15// Typed request with body
16interface TypedRequest<T> extends Request {
17 body: T;
18}
19
20// In-memory storage
21const users: User[] = [
22 { id: 1, name: "Alice", email: "alice@example.com" },
23 { id: 2, name: "Bob", email: "bob@example.com" },
24];
25
26// Express app
27const app = express();
28app.use(express.json());
29
30// Error handler middleware
31function errorHandler(
32 err: Error,
33 req: Request,
34 res: Response,
35 next: NextFunction
36): void {
37 console.error(err.stack);
38 res.status(500).json({ error: err.message });
39}
40
41// Routes
42app.get("/api/users", (req: Request, res: Response) => {
43 res.json(users);
44});
45
46app.get("/api/users/:id", (req: Request, res: Response) => {
47 const id = parseInt(req.params.id, 10);
48 const user = users.find((u) => u.id === id);
49
50 if (!user) {
51 res.status(404).json({ error: "User not found" });
52 return;
53 }
54
55 res.json(user);
56});
57
58app.post(
59 "/api/users",
60 (req: TypedRequest<CreateUserBody>, res: Response) => {
61 const { name, email } = req.body;
62
63 if (!name || !email) {
64 res.status(400).json({ error: "Name and email are required" });
65 return;
66 }
67
68 const newUser: User = {
69 id: users.length + 1,
70 name,
71 email,
72 };
73
74 users.push(newUser);
75 res.status(201).json(newUser);
76 }
77);
78
79app.delete("/api/users/:id", (req: Request, res: Response) => {
80 const id = parseInt(req.params.id, 10);
81 const index = users.findIndex((u) => u.id === id);
82
83 if (index === -1) {
84 res.status(404).json({ error: "User not found" });
85 return;
86 }
87
88 users.splice(index, 1);
89 res.status(204).send();
90});
91
92app.use(errorHandler);
93
94const PORT = 3000;
95app.listen(PORT, () => {
96 console.log(`API server running at http://localhost:${PORT}`);
97});

Run this example locally

$ npx ts-node backend/express-api.ts