Chapter 3 of 10
Routing maps HTTP method + URL patterns to handler functions. Express has a flexible routing system that supports parameters, optional segments, query strings, and route grouping with Router.
app.get("/courses", getAllCourses); // GET /courses
app.post("/courses", createCourse); // POST /courses
app.put("/courses/:id", updateCourse); // PUT /courses/42
app.patch("/courses/:id", patchCourse); // PATCH /courses/42
app.delete("/courses/:id", deleteCourse); // DELETE /courses/42
// Route parameters โ dynamic segments prefixed with :
app.get("/courses/:id", (req, res) => {
const { id } = req.params; // id from the URL
const course = getCourse(id);
if (!course) return res.status(404).json({ error: "Not found" });
res.json(course);
});
// Multiple parameters
app.get("/courses/:courseId/chapters/:chapterId", (req, res) => {
const { courseId, chapterId } = req.params;
res.json({ courseId, chapterId });
});
// Query string โ /courses?category=frontend&limit=10
app.get("/courses", (req, res) => {
const { category, limit = 20, page = 1 } = req.query;
const courses = getCourses({ category, limit: Number(limit), page: Number(page) });
res.json(courses);
});// routes/courses.js
const router = require("express").Router();
router.get("/", getAllCourses);
router.get("/:id", getCourse);
router.post("/", createCourse);
router.put("/:id", updateCourse);
router.delete("/:id", deleteCourse);
module.exports = router;
// index.js โ mount the router
const coursesRouter = require("./routes/courses");
app.use("/api/courses", coursesRouter);
// Now: GET /api/courses โ getAllCourses
// GET /api/courses/42 โ getCourse