【问题标题】:"Default" parameter on every ejs render call?每个 ejs 渲染调用的“默认”参数?
【发布时间】:2020-01-26 21:34:08
【问题描述】:

为了验证用户是否是管理员,我在 all 我的 ejs 文件中执行以下代码

在 node.js 路由中,我在渲染 ejs 时将用户作为参数发送

 router.get('/', (req, res) => {
 res.render('index.ejs',{query: req.session.username});
 });

在我的前端,我只是这样做:

  <% if(query == 'pedrosarkis'){ %>
  <li class="nav-item admin">
    <a class="nav-link" href="/admin">Admin</a>
  </li> <% } %> 

“问题”(我猜是这样)是我的页面太多,这意味着我必须将用户名作为参数传递给每个路由,有没有办法在 ejs 出现时传递参数渲染?像中间件或类似的东西

【问题讨论】:

    标签: javascript node.js express ejs


    【解决方案1】:

    您可以编写一个辅助函数作为简单的抽象。即使在几个地方添加行 query: req.session.username, 也不应该有那么大的麻烦。

    const renderEJS = (req, res, fileName, options = {}) => 
      res.render(fileName, {
        query: req.session.username,
        ...options
      });
    
    renderEJS(req, res, 'index.ejs');
    

    const prepareEJSOptions = (req, options = {}) => ({
       query: req.session.username,
       ...options
    });
    
    const options = prepareEJSOptions(req);
    res.render('index.ejs', options);
    

    【讨论】:

      【解决方案2】:

      很简单,使用locals对象,根据docs,就是

      一个对象,其中包含范围为 请求,因此仅可用于期间呈现的视图 该请求/响应周期(如果有)。否则,此属性为 与 app.locals 相同。

      此属性对于公开请求级信息很有用,例如 请求路径名、认证用户、用户设置等。

      因此,在您的主 js 文件(app.js、server.js,无论您如何命名)中,在您的路由定义之前,您可以使用以下中间件

      app.use(function (req, res, next) {
        res.locals.query = req.session.username;
        next();
      });
      

      query 可以在每个渲染的 ejs 文件中访问

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 2015-02-17
        • 2013-04-08
        • 2018-12-26
        • 1970-01-01
        • 2014-01-24
        • 2019-02-03
        相关资源
        最近更新 更多