2011-01-28 52 views
5

我在nodejs中使用express,并试图保持我的视图呈现干燥。在我的布局,我有类似以下的(我用玉)的在expressjs渲染中烘干布局当地人

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'到我所呈现的任何地方

回答

9

我知道这个答案是晚了,但为后人:如果你使用的是快递,你应该使用提供的动态助手,这是可视化的助手功能,以req,res为参数。你的情况:

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

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

+0

这个貌似比我更好的答案;当我第一次问这个问题时,我不确定集成的帮手是如何融入Express的,尽管 – Ryan 2011-08-09 23:43:27

0

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

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)); 

可能有更好的东西,但它是我已经想通了最好的解决方案至今