在expressjs渲染中干燥布局本地

时间:2011-01-28 07:30:38

标签: node.js dry express pug

我在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'到我渲染的本地人

3 个答案:

答案 0 :(得分:9)

我知道这个答案已经很晚了,但对于后人来说:如果你使用express,你应该使用提供的动态助手,它们是视图可访问的辅助函数,它以req,res为参数。在你的情况下:

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

这意味着您的观点现在可以调用#{user}

答案 1 :(得分: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));

可能有更好的东西,但这是我迄今为止已经找到的最佳解决方案

答案 2 :(得分:0)

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

function(req) {
    return {
        currentUser: req.session.currentUser,
        /*all of my other locals*/
    };
}

res.render('anything.jade',{
  locals: defaultLocals(req)
});