如何在Express.js中为每个路由存储变量?

时间:2019-05-12 10:30:01

标签: node.js express express-session

因此,我正在构建一个简单的身份验证应用程序,并且正在使用快速会话来执行此操作。对于用户界面,我需要在导航栏中显示一个用于登录的按钮(如果用户尚未登录)以及一个用于注销的按钮(如果用户尚未登录)。

问题是,我不确定如何在所有路由中存储此状态,而无需为每个路由使用相同的代码。目前,我已经在索引路由上找到了它,效果很好:

/* GET home page. */
router.get('/', function(req, res, next) {
  var logged_in = false;
  if (req.session.userId) {
    logged_in = true;
  }
  res.render('general/index', { is_logged_in: logged_in});
});

然后在导航栏中动态显示按钮,如下所示:

<% if( is_logged_in){ %>
<li class="nav-item active">
<a class="nav-link" href="/users/logout">Logout<span class="sr-only">(current)</span></a>
</li>
<% } else { %>  
<li class="nav-item active">
<a class="nav-link" href="/login">Login<span class="sr-only">(current)</span></a>
</li>
<% } %>

但是问题是,如果我要对导航栏起作用,则必须对每个路由使用相同的代码,这与DRY编码做法背道而驰。如何动态显示此按钮,而不必在每个路由上重复相同的代码位,检查是否存在用户会话ID?是否设置全局变量?我是Express的新手,因此感谢所有帮助。谢谢

1 个答案:

答案 0 :(得分:2)

您可以设置中间件来设置登录状态,并在请求的生存期内使用res.locals

function checkLoggedIn(req, res, next) {
  var logged_in = false;
  if (req.session.userId) {
    res.locals.logged_in = true;
  }
}

然后可以将其安装在所有路径上,或将其链接到某些路径:

// all routes after this middleware:
app.use(checkLoggedIn)

// chain it
app.get('/mypath', checkLoggedIn, (req, res) => { ... })

res.locals也可以查看,因此您可以在渲染过程中通过以下操作。

// You can simply render
res.render('general/index');

// logged_in variable is available to view
<% if(logged_in){ %>