5

我在 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”到当地人

4

3 回答 3

9

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

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

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

于 2011-07-22T23:00:00.850 回答
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));

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

于 2011-02-17T07:41:04.090 回答
0

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

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

res.render('anything.jade',{
  locals: defaultLocals(req)
});
于 2011-01-29T00:15:02.157 回答