如何在控制器中使用全局变量?

问题描述 投票:0回答:1

我想在每个视图中使用一个名为“user”的变量,我认为解决这个问题的方法是将变量从控制器共享到视图,但我有 20 个视图,所以我不想添加 20 次我控制器的每个方法中的变量。例如,这里我将变量 user 共享到视图配置文件,但我想在所有视图中使用此变量:

profile: (req,res) => {
 if (req.session.user) {
      res.render("profile",{user:req.session.user})
 }
 else{
      res.render("login")
 }
}
express model-view-controller view parameters controller
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 匹配。

© www.soinside.com 2019 - 2024. All rights reserved.