我想在每个视图中使用一个名为“user”的变量,我认为解决这个问题的方法是将变量从控制器共享到视图,但我有 20 个视图,所以我不想添加 20 次我控制器的每个方法中的变量。例如,这里我将变量 user 共享到视图配置文件,但我想在所有视图中使用此变量:
profile: (req,res) => {
if (req.session.user) {
res.render("profile",{user:req.session.user})
}
else{
res.render("login")
}
}
这就是 res.locals 的用途。模板引擎将自动搜索
res.locals
您在模板中引用的任何变量,因此如果您将其放在那里,则不必手动将其传递给每个 res.render()
调用。
所以,您可以像这样在控制器路由之前定义中间件:
app.use((req, res, next) => {
if (req.session.user) {
res.locals.user = req.session.user;
next();
} else {
res.redirect("/login");
}
});
然后,您的控制器端点可以是这样的:
profile: (req,res) => {
res.render("profile");
}
如果
req.session.user
存在,它将把user
对象放入res.locals
,模板可以引用user
,模板引擎会为你找到它(就像你将它传递给res.render()
一样.
如果
req.session.user
不存在,那么中间件将重定向到/login
。这通常比为实际上是您的个人资料 URL 的 URL 呈现登录页面要好。呈现的内容应与 URL 匹配。