【问题标题】:DRYing up layout locals in expressjs rendering在 expressjs 渲染中干燥布局局部变量
【发布时间】:2011-06-17 02:07:01
【问题描述】:

我在 nodejs 中使用 express,并试图保持视图渲染干燥。在我的布局中,我有如下内容(我正在使用玉)

body
  nav.login
    -if(currentUser)
      ="logged in information"
    -else
      ="logged out information"
  !=body

问题是每次渲染时,我现在都需要拥有

res.render('anything.jade',{
  locals: {
    currentUser: req.session.currentUser,
    /*all of my other locals*/
  }
});

必须完成所有渲染调用并添加它似乎很痛苦,然后如果我必须将任何其他本地人添加到布局中,然后做同样的事情。有什么方法可以避免在我渲染的任何地方重新输入“currentUser”到本地人中

【问题讨论】:

    标签: node.js dry express pug


    【解决方案1】:

    最简单的解决方案是使用返回本地对象的函数。

    function(req) {
        return {
            currentUser: req.session.currentUser,
            /*all of my other locals*/
        };
    }
    
    res.render('anything.jade',{
      locals: defaultLocals(req)
    });
    

    【讨论】:

      【解决方案2】:

      我最终做了以下事情:

      首先,我设置了一些局部变量

      app.use(function(req,res,next){
        req.localvars = new Object;
        next();
      });
      

      后来,我设置了一些局部变量

      app.use(function(req,res,next){
        req.localvars.currentUser = req.session.currentUser;
        next();
      });
      

      我设置了一个渲染函数

      function renderer(file){  
        return function(req,res,next){
          res.render(file,{locals:req.localvars});
        }
      }
      

      然后为路由功能

      app.get('/',blah,blah,whatever,setSomeMoreLocalsHere,renderer(index.jade));
      

      可能会有更好的解决方案,但这是我迄今为止想出的最佳解决方案

      【讨论】:

        【解决方案3】:

        我知道这个答案已经晚了,但为了后代:如果您使用的是 express,您应该使用提供的动态帮助器,它们是可查看的帮助器函数,它以 req,res 作为参数。在你的情况下:

        app.dynamicHelpers({
          user: function(req, res){
            return req.session.currentUser;
          }
        });
        

        这意味着你的视图现在可以调用#{user}

        【讨论】:

        • 这看起来比我的更好;不过,当我第一次问这个问题时,我不确定将帮助程序集成到 Express 中的效果如何
        • 这是一个很棒的提示。我曾经将“站点”对象传递给每个 render() 调用。谢谢!
        猜你喜欢
        • 1970-01-01
        • 2015-10-23
        • 2012-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多