【问题标题】:How can I access session data in an EJS template with a node.js backend?如何使用 node.js 后端访问 EJS 模板中的会话数据?
【发布时间】:2020-06-04 17:36:50
【问题描述】:

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

现在,我有 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 模板,那么在每条路由中传递会话效率不高。

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

【问题讨论】:

  • 你必须使用 -#{menu}
  • 谢谢#Deep。你能描述一下如何使用#{menu}吗?
  • 是 req.session.menubar 数组还是字符串?这是一个 json 吗?如果您在问题中分享 req.session.menubar 的值会更好。
  • 这样的数组 req.session.menubar = ['/home','/contact']

标签: node.js express ejs node-modules


【解决方案1】:
  1. 您是否包含this answer 中所示的 HTML 文件?

  2. 假设您使用的是express-session,您可能还需要设置中间件将会话信息分配给响应res),如this answer所示。

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 而不是请求对象。

【讨论】:

  • 它在渲染视图时可以正常工作。但是假设如果我们调用 ajax 并且如果您重新加载页面则成功。它不会反映在视图中。
【解决方案2】:

由于EJS 是基于转义到JavaScript,因此可以使用语言中的循环结构来呈现列表。

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

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

【讨论】:

    【解决方案3】:

    为了在每个模板上获取它,您需要首先将会话存储在数据库集合中。您为此使用 connect-mongo 包。来自文档:

    const session = require('express-session');
    const MongoStore = require('connect-mongo')(session);
    
    app.use(session({
        secret: 'foo',
        store: new MongoStore(options)
    }));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-26
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多