我想知道是否有一种简单的方法可以从 Jade 模板中访问 Express.js 的 req 或会话变量,而无需通过正常响应传递它。
或者这是唯一的方法?
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);
让你的会议在翡翠
p #{session}
在 express 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
.
您需要创建一个dynamicHelper
供 Express 使用。
app.dynamicHelpers({
session: function (req, res) {
return req.session;
}
});
然后在您的模板中,您可以使用<%= session.logged_in %>
或其他任何东西。
注意:在 Express 3 中不推荐使用 dynamicHelper
只需使用中间件。
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>
这对我有用
app.use(function(req,res,next){
res.locals.user = req.user;
next();
});
在哈巴狗或翡翠视图用户
#{user.email}
虽然 javascript 中总有一种方法可以逃脱范围并向上爬行,但我真的真的真的真的真的非常非常强烈地鼓励你找到另一种方法。
考虑一下您要问的问题:我可以让我的视图了解我的控制器的内容吗?
或者你真正要问的是:我可以让我的观点了解我的运行时的胆量吗?
视图应该获取数据并将其转换为标记。就是这样。如果你做任何其他事情,你就做错了。我不在乎它有多“容易”。这就是接口的意义所在。准确定义正在传递的内容,并使其易于用另一件事替换一件事。
您可以使用渲染函数来解决此问题,在该函数中,您可以将需要会话变量的每个视图渲染为模板中可访问的局部变量(例如,通常在用户登录时)。
这是一个函数示例,但您可以根据需要进行调整:
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}
如果您的会话对象变量是全局声明的,那么 In global
变体
在功能
sess=req.session
req.render('index.pug',{sess})