【问题标题】:How do I store a variable for every route in Express.js?如何在 Express.js 中为每条路由存储一个变量?
【发布时间】:2019-05-12 18:51:26
【问题描述】:

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

问题是,如果不对每条路线使用相同的代码,我不确定如何在我的所有路线中存储此状态。目前我在索引路线上有这个,效果很好:

/* 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 的新手,所以感谢所有帮助。谢谢

【问题讨论】:

    标签: node.js express express-session


    【解决方案1】:

    您可以设置一个中间件来设置登录状态并在请求的生命周期内使用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){ %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 2012-12-17
      • 2019-09-12
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      相关资源
      最近更新 更多