Route Parameters
":" se shuru hone waala segment EK DYNAMIC PARAMETER hai. "/users/:id" par "/users/42" hit karne se req.params.id = "42" milta hai. Multiple params bhi ho sakte hain: "/users/:userId/posts/:postId".
Params HAMESHA STRING hote hain, chaahe URL mein number ho. Database query se pehle Number() ya validation zaroor karo. Path ko constrain karne ke liye regex bhi de sakte ho: "/users/:id(\\d+)" sirf digits match karega.
app.get("/users/:userId/posts/:postId", (req, res) => {
const { userId, postId } = req.params;
res.json({ userId, postId }); // dono STRING honge
});
app.get("/orders/:id(\\d+)", getOrder); // sirf numeric id match karega- ":name" wala segment dynamic parameter banta hai, req.params mein milta hai
- Params hamesha string hote hain, number chahiye to convert karo
- Regex constraint se galat format wali requests route tak pahunchti hi nahi
URL ke dynamic segments req.params object mein aate hain, key wahi hoti hai jo ":" ke baad likhi thi. Nested resources mein multiple params common hain — "/users/:userId/posts/:postId" se dono ids alag-alag mil jaati hain.
app.get("/users/:userId/posts/:postId", (req, res) => {
const { userId, postId } = req.params;
res.json({ userId: Number(userId), postId: Number(postId) });
});Agar har route mein same id se resource load karna pad raha hai, to router.param() ek hi jagah wo kaam kar sakta hai — jab bhi us param waala route match ho, ye pehle chalta hai aur resource ko req par attach kar deta hai.
router.param("id", async (req, res, next, id) => {
const user = await db.findUser(id);
if (!user) return res.status(404).json({ error: "User not found" });
req.user = user;
next();
});
router.get("/:id", (req, res) => res.json(req.user)); // ab seedha use