2011-06-13 21 views

回答

20

您需要为Express创建一个dynamicHelper才能使用。

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

然后你的模板里面,你可以使用<%= session.logged_in %>或什么的。

注:dynamicHelpers在快递3

+0

太棒了,这正是我所需要的。谢谢! – MrBojangles 2011-06-13 18:14:02

1

虽然总是在JavaScript中的方式来逃避范围和向上爬行,我真的真的真的真的真的强烈建议您另谋出路。

考虑你在问什么:我可以让我的视野知道我的控制器的内胆吗?

或者你真的在问:我可以让我的视图知道我的运行时间的胆量吗?

视图应该将数据转换为标记。而已。如果你做其他事情,你做错了。我不在乎它有多“容易”。这是界面的要点。要准确定义传递的内容,并使得用另一件事物替换一件事情变得容易。

+0

我希望做的是使用会话来确定用户是否登录或不是这将改变网站各个部分上所有模板的许多内容。 所以我只是不想为网站上的每个模板通过 “logged_in:req.session.logged_in” 。从一个PHP的历史来看,我知道Smarty推荐使用{$ smarty.session.logged_in}来解决这个问题。 – MrBojangles 2011-06-13 16:04:27

+8

这有点苛刻和无益的答案。我遵循一些严格的MVC指导方针,就像下一个人一样,但是我们正在讨论在这种情况下的html模板中的if()语句。 当你考虑另一个选择是为了登录和未登录的用户有两个完全不同的模板时,打破一些MVC成为两个邪恶中较小的一个。 – 2011-09-16 09:48:46

+3

不正确。我会从控制器传递数据,我不希望视图知道如何调用其他模型。我不介意有分支逻辑或计数器/迭代器和循环的视图,但这是它应该具有的所有逻辑。我只是传递数据,所以我会谈到的其他人做MVC – jcolebrand 2011-09-16 14:40:10

45

弃用快递3.x中,dynamicHelpers已被删除,所以你需要使用中间件和res.locals的组合。比方说,我们要访问req.query/signup/new观点:

localQuery = function(req, res, next) { 
    res.locals.query = req.query; 
    next(); 
}; 

newSignup = function(req, res) { 
    res.render('signup/new'); 
}; 

app.get('signup/new', localQuery, newSignup); 

现在它使用localQuery中间件任何路线,将有res.locals.query集。这可以在您的视图中作为query访问。

+3

几个小时以来,我的头在这燃烧着。你是一个拯救生命的人:) – 2013-01-17 17:25:06

3

只是使用中间件。

app.use(function (req, res, next) { 
      var origRender = res.render; 
      res.render = function (view, locals, callback) { 
       if ('function' == typeof locals) { 
        callback = locals; 
        locals = undefined; 
       } 
       if (!locals) { 
        locals = {}; 
       } 
       locals.req = req; 
       origRender.call(res, view, locals, callback); 
      }; 
      next(); 
}); 

之后,您可以使用“#{req}”在玉模板中引用它。

假设您在'req'中有一个'用户'对象,'user'有一个方法'isAnonymous',如果您的用户是 。isAnonymous()返回true,

p #{req.user.isAnonymous()} 

将呈现为:

<p>true</p> 
43

只需添加

app.use(express.cookieParser()); 
app.use(express.session({secret: '1234567890QWERTY'})); 
app.use(function(req,res,next){ 
    res.locals.session = req.session; 
    next(); 
}); 

之前

app.use(app.router); 

和玉

让您的会议
p #{session} 
+2

谢谢。简单而有用。 – veinhorn 2014-08-07 10:31:30

+0

可能是最好的答案! – siva636 2015-07-12 15:59:32

+0

非常好,为我工作 – 2016-02-24 10:35:47

0

这个工作对我来说

app.use(function(req,res,next){ 
    res.locals.user = req.user; 
    next(); 
}); 

的哈巴狗或玉视图用户

#{user.email} 
0

你可以用渲染功能,可以解决这您可以使用它提供一切需要的会话视图变量作为模板中可访问的局部变量(通常在用户登录时)。

这里是一个函数的例子,但你可以调整你喜欢:

var renderView = function(res, template, context, session, cb) { 
    context.session = session; 

    if(cb){ 
     res.render(template, context, function(error, html){ 
      cb(error, html) 
     } 
    } else { 
     res.render(template, context) 
    } 
} 

然后,它可以像这样使用:

app.get("/url", function(req, res){ 

    req.session.user_email = user_email; 

    renderView(res, "template_name", { local_variables: local_variables }, req.session) 
}); 

,并在您玉模板,你可以访问会话变量是这样的:

div.user-email #{session.user_email}