我想知道是否有一种简单的方法可以在Jade模板中访问Express.js的req或session变量,而不需要通过正常响应传递它。
还是这是唯一的方法?
res.render('/', {
session: req.session
});
只需要添加
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);
并在Jade中获取您的会话
p #{session}
在 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
。
dynamicHelper
以供Express使用。app.dynamicHelpers({
session: function (req, res) {
return req.session;
}
});
然后在您的模板中,您可以使用 <%= session.logged_in %>
或其他内容。
注意:Express 3 中已不建议使用 dynamicHelpers。
这对我非常有效
app.use(function(req,res,next){
res.locals.user = req.user;
next();
});
在 Pug 或 Jade 视图中,用户
#{user.email}
只需使用中间件。
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}"在jade模板中引用它。
假设您在'req'中有一个'user'对象,并且'user'有一个名为'isAnonymous'的方法,如果您的user.isAnonymous()返回true,
p #{req.user.isAnonymous()}
将被渲染为:
<p>true</p>
虽然在JavaScript中总有一种方法可以逃脱作用域并向上爬,但我真的非常强烈建议您找到另一种方法。
考虑一下你所要求的:我的视图是否可以知道控制器的内部细节?
或者你真正想问的是:我的视图是否可以知道运行时的内部细节?
视图应该将数据转换为标记。这就是它的作用。如果你做了其他事情,那么你就错了。我不在乎这有多“容易”。这就是接口的目的。定义传递的内容,并使其易于用另一个东西替换。
sess=req.session
req.render('index.pug',{sess})
你可以通过一个渲染函数来解决这个问题,在该函数中,你可以将需要会话变量的每个视图都呈现为在模板中可访问的本地变量(通常是当用户已登录时)。
以下是一个函数示例,但你可以根据需要进行调整:
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)
});
在您的jade模板中,您可以像这样访问会话变量:
div.user-email #{session.user_email}