Express Setup
// npm install express
const express = require("express");
const app = express();
// Middleware:
app.use(express.json()); // parse JSON bodies
app.use(express.static("public")); // serve static files
// Routes:
app.get("/", (req, res) => res.send("Hello!"));
app.get("/api/users", (req, res) => res.json({ users: [] }));
app.post("/api/users", (req, res) => {
const user = req.body;
res.status(201).json({ ...user, id: Date.now() });
});
app.listen(3000, () => console.log("Running on :3000"));
Routing & Middleware
// Route params and query strings:
app.get("/api/users/:id", (req, res) => {
const { id } = req.params; // from :id
const { fields } = req.query; // from ?fields=name,email
res.json({ id, fields });
});
// Custom middleware:
function logger(req, res, next) {
console.log(req.method, req.path, new Date().toISOString());
next(); // MUST call next() or request hangs!
}
app.use(logger);
// Auth middleware on specific routes:
function auth(req, res, next) {
const token = req.headers.authorization?.split(" ")[1];
if (!token) return res.status(401).json({ error: "Unauthorized" });
req.user = verifyToken(token);
next();
}
app.get("/api/profile", auth, (req, res) => res.json(req.user));
// Router — split routes into files:
const usersRouter = express.Router();
usersRouter.get("/", getUsers);
usersRouter.post("/", createUser);
app.use("/api/users", usersRouter);
// Error handler — 4 params:
app.use((err, req, res, next) => {
res.status(500).json({ error: err.message });
});
⚡ Key Takeaways
- Always use express.json() middleware for JSON APIs
- Route params via :paramName in path, accessed via req.params
- Query strings via ?key=val, accessed via req.query
- Middleware must call next() or the request hangs forever
- Use Express Router to organize routes into separate files
- Error middleware needs 4 params: (err, req, res, next)
🎯 Practice Exercises
EXERCISE 1
Build an Express API for books: GET /books, GET /books/:id, POST /books, PATCH /books/:id, DELETE /books/:id. Use an array as the data store. Add request logging middleware.