Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用node.js后端访问EJS模板中的会话数据?_Node.js_Express_Ejs_Node Modules - Fatal编程技术网

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

如何使用node.js后端访问EJS模板中的会话数据?,node.js,express,ejs,node-modules,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(re

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

现在,我有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})
}    
<ul class="menubar">
  <% for(var i=0; i < menu.length; i++) { %>
     <li class="menu-title">
        <%= menu[i] %>
     </li>
  <% } %>
在上面的代码中,我需要在每个页面上传递会话数据。如果我有50个html模板,那么在每个路由中传递会话是没有效率的


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

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

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

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

  • 是否包含如中所示的HTML文件

  • 假设您正在使用,您可能还需要设置中间件,将会话信息分配给响应
    res
    ),如中所示

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

    为了在每个模板上获得它,您需要首先将会话存储在数据库集合上。为此,您可以使用
    connectmongo
    包。从文档中:

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

    你必须使用-#{菜单}谢谢#Deep。你能描述一下如何使用#{menu}吗?是req.session.menubar数组还是一个字符串?这是json吗?如果您在question.array中共享req.session.menubar的值会更好,就像这样req.session.menubar=['/home','/contact']它在渲染视图时可以正常工作。但是假设我们调用ajax,如果您重新加载页面,那么就成功了。它不会反映在我们的视野中。