express.Router()
Router EK ISOLATED middleware + route collection hai jise alag file mein rakhkar app.use("/prefix", router) se MOUNT kiya ja sakta hai. Isse ek hi bade app.js ke bajaye feature-wise files banti hain.
Router ke apne middleware bhi ho sakte hain jo sirf USI router ke routes par chalte hain — jaise "/admin" router par auth check. Mounting path automatically har child route ke aage lag jaata hai.
// routes/users.js
const router = require("express").Router();
router.use(requireAuth); // sirf is router ke liye
router.get("/", listUsers); // final path: /users
router.get("/:id", getUser); // final path: /users/:id
module.exports = router;
// app.js
app.use("/users", require("./routes/users"));- Router = mini-app jisme apne routes aur middleware hote hain
- app.use("/prefix", router) se mount hota hai, prefix auto-prepend hota hai
- Router-level middleware sirf usi router ke routes par chalta hai
Bade app mein har feature ka apna router file hota hai — routes/users.js, routes/orders.js — aur app.js sirf unhe mount karta hai. Isse merge conflicts kam hote hain aur naya developer aasaani se samajh leta hai ki kaunsa code kahan hai.
// app.js
app.use("/api/users", require("./routes/users"));
app.use("/api/orders", require("./routes/orders"));
app.use("/admin", requireAdmin, require("./routes/admin"));Default se child router ko parent ke route params NAHI milte. Nested routers mein (jaise /users/:userId/orders) Router({ mergeParams: true }) lagana padta hai, tabhi child ke andar req.params.userId available hota hai.
const orders = require("express").Router({ mergeParams: true });
orders.get("/", (req, res) => res.json({ userId: req.params.userId }));
app.use("/users/:userId/orders", orders);