从Jade模板访问Express.js请求或会话
我想知道是否有一个简单的方法来访问Express.js的需求或会话variables从一个Jade模板中,而不通过正常的响应传入。
或者这是唯一的方法?
res.render('/', { session: req.session });
您需要创build一个dynamicHelper
使用。
app.dynamicHelpers({ session: function (req, res) { return req.session; } });
然后在你的模板里,你可以使用<%= session.logged_in %>
或其他。
注意:ExpressHelper中不赞成使用dynamicHelpers
在Express 3.x中,dynamicHelpers已被删除,因此您需要使用中间件和res.locals
的组合。 假设我们想要在/signup/new
视图中访问req.query
:
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
在您的视图中进行访问。
只需添加
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}
只是使用中间件。
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'对象,'user'有一个方法'isAnonymous',如果你的user.isAnonymous()返回true,
p #{req.user.isAnonymous()}
将呈现为:
<p>true</p>
虽然在JavaScript中总有一种方法可以逃避范围并向上爬,但我确实真的非常强烈地鼓励你find另一种方式。
考虑你在问什么:我可以让我的观点知道我的控制器的胆量吗?
或者你真的在问:我可以让我的视图知道我的运行时间的胆量吗?
一个视图应该把数据转换成标记。 而已。 如果你做别的事,你做错了。 我不在乎它是多么“容易”。 这是一个界面的要点。 要准确定义传递的内容,并使用另一件事物来replace一件事情变得容易。
这对我工作
app.use(function(req,res,next){ res.locals.user = req.user; next(); });
在帕格或玉观看用户
#{user.email}
你可以用一个渲染函数来解决这个问题,在这个渲染函数中,你需要将每个需要会话variables的视图渲染成模板中可以访问的局部variables(通常是用户login的时候)。
这是一个函数的例子,但你可以随意调整:
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) });
在你的玉石模板中,你可以像这样访问会话variables:
div.user-email #{session.user_email}