英文:
How can I use a variable as global in my controller?
问题
我想在每个视图中使用一个名为"user"的变量,我认为解决这个问题的方法是从控制器共享变量到视图,但我有20个视图,所以我不想在控制器的每个方法中都添加20次这个变量。例如,这里我正在将变量"user"共享到视图"profile",但我希望在所有视图中使用这个变量:
profile: (req, res) => {
if (req.session.user) {
res.render("profile", { user: req.session.user })
} else {
res.render("login")
}
}
英文:
I want to use a variable called "user" in every view, i think a way to solve this is to shared the variable from the controler to the views, but I have 20 views, so I don't want to add 20 times the variable in every method of my controller. For example, here I'm sharing the variable user, to the view profile, but I want to use this variable in all views:
profile: (req,res) => {
if (req.session.user) {
res.render("profile",{user:req.session.user})
}
else{
res.render("login")
}
}
答案1
得分: 0
这是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匹配。
英文:
This is what res.locals is for. Template engines will automatically search res.locals
for any variable that you reference in your template so if you put it there, then you don't have to pass it manually to every res.render()
call.
So, you could make middleware that is defined before your controller routing like this:
app.use((req, res, next) => {
if (req.session.user) {
res.locals.user = req.session.user;
next();
} else {
res.redirect("/login");
}
});
Then, your controller endpoint can just be this:
profile: (req,res) => {
res.render("profile");
}
If req.session.user
exists, it will put the user
object into res.locals
where the template can just reference user
and the template engine will find it for you (just the same as if you passed it to res.render()
.
If req.session.user
does not exist, then the middleware will redirect to /login
. This is generally better than rendering the login page for a URL that is actually your profile URL. The rendered content should match the URL.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论