In express 3.x, dynamicHelpers have been removed so you will need to use a combination of middleware and res.locals. Let's say we want to access req.query in a /signup/new view:
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);
Now any route which uses the localQuery middleware, will have res.locals.query set. This can then be accessed in your view as query.
You'll need to create a dynamicHelper for Express to use.
app.dynamicHelpers({
session: function (req, res) {
return req.session;
}
});
Then inside your template, you can use <%= session.logged_in %> or whatever.
Note: dynamicHelpers are deprecated in Express 3
just use a middleware.
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();
});
After which you can use "#{req}" to refer to it in a jade template.
Suppose you have a 'user' object in 'req', and 'user' has a method 'isAnonymous', if your user.isAnonymous() returns true,
p #{req.user.isAnonymous()}
will be rendered as :
<p>true</p>
While there is always a way in javascript to escape the scope and crawl upwards, I really really really really really strongly encourage you to find another way.
Consider what you're asking: Can I have my view know about the guts of my controller?
Or what you're really asking: Can I have my view know about the guts of my runtime?
A view is supposed to take data and transform it into markup. That's IT. If you do anything else, you're doing it wrong. I don't care how "easy" it is. That's the point of an interface. To define exactly what is being passed, and to make it easy to replace one thing with another thing.