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

How can I access session data in an EJS template with a node.js backend?

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

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

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

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

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

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

  1. 您是否包括 this answer 中所示的 HTML 文件?

  2. 假设您正在使用 express-session, you may also need to set up middleware to assign session information to the response (res), as shown in

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

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

const session = require('express-session');
const MongoStore = require('connect-mongo')(session);

app.use(session({
    secret: 'foo',
    store: new MongoStore(options)
}));