res.render & Locals
res.render(view, data) template ko data ke saath render karke HTML response bhej deta hai. Render ASYNCHRONOUS hota hai — agar template mein error ho to Express automatically error middleware tak error pahuncha deta hai.
app.locals poore app ke liye shared variables rakhta hai (site name, version) aur res.locals SIRF CURRENT REQUEST ke liye (logged-in user, flash message). Dono har template mein bina explicitly pass kiye available hote hain.
app.locals.siteName = "Code10x"; // sab requests
app.use((req, res, next) => {
res.locals.currentUser = req.user; // is request ke liye
next();
});
app.get("/dash", (req, res) => res.render("dash", { stats }));- res.render(view, data) template + data se HTML banakar bhej deta hai
- app.locals = app-wide variables, res.locals = per-request variables
- Dono templates mein automatically available hote hain
Template ko teen jagah se data milta hai: app.locals (app-wide), res.locals (is request ke liye), aur res.render() ka data object. Conflict hone par render ka data sabse upar jeetta hai, phir res.locals, phir app.locals.
app.locals.siteName = "Code10x";
res.locals.user = req.user;
res.render("home", { title: "Dashboard" });
// template mein: siteName, user, title teeno availableres.render() asynchronous hai. Agar callback do to Express khud response nahi bhejta — tumhe HTML manually bhejna padega, lekin error handle karne ka mauka mil jaata hai. Bina callback ke error automatically error middleware par chala jaata hai.
res.render("report", data, (err, html) => {
if (err) return next(err);
res.send(html);
});