如何使用node.js后端访问EJS模板中的会话数据?

时间:2017-12-12 05:58:31

标签: node.js express ejs node-modules

我根据用户的角色创建了一个动态菜单栏。在服务器端,当用户登录时,我将所有允许的页面存储在他们的会话中。

现在,我有15个模板。我在每个页面上都包含menubar.html文件。我想在menubar.html中使用会话数据,而不必每次都明确地传递它。

我尝试过以下代码:

app.get('/home',function(req,res)){
  res.render('home',{menu : req.session.menubar})
}
app.get('/contact',function(req,res)){
  res.render('contact',{menu : req.session.menubar})
}    

在上面的代码中,我需要在每个页面上传递会话数据。如果我有50个html模板,那么在每个路径中传递会话效率都不高。

处理此问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

由于EJS基于转义为JavaScript,因此可以使用语言中的循环结构来完成渲染列表。

要在ejs模板上显示数组的值,可以使用以下代码:

<ul class="menubar">
  <% for(var i=0; i < menu.length; i++) { %>
     <li class="menu-title">
        <%= menu[i] %>
     </li>
  <% } %>

答案 1 :(得分:1)

  1. 您是否包含了this answer

  2. 中显示的HTML文件
  3. 假设您使用的是express-session,您可能还需要设置中间件以将会话信息分配给响应res),如{ {3}}

  4. <强> app.js

    app.use(session({
      secret: "sosecret",
      saveUninitialized: false,
      resave: false
    }));
    
    // middleware to make 'user' available to all templates
    app.use(function(req, res, next) {
      res.locals.user = req.session.user;
      next();
    });
    

    然后尝试引用res.locals.user而不是请求对象。

答案 2 :(得分:0)

为了在每个模板上使用它,您需要首先将会话存储在数据库集合中。为此,您使用success: function (response) { if (response) { alert("exists"); } else { alert("not exists"); } } 软件包。从文档中:

connect-mongo