Доступ к req или сеансу Express.js из шаблона Jade
Мне интересно, есть ли простой способ получить доступ к req или сеансовым переменным Express.js из шаблона Jade, не передавая его через обычный ответ.
Или это единственный способ?
res.render('/', {
session: req.session
});
8 ответов
Вам нужно будет создать dynamicHelper
Экспресс для использования.
app.dynamicHelpers({
session: function (req, res) {
return req.session;
}
});
Тогда внутри вашего шаблона вы можете использовать <%= session.logged_in %>
или что угодно.
Примечание: dynamicHelpers устарела в Express 3
Просто добавь
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 динамические помощники были удалены, поэтому вам нужно будет использовать сочетание промежуточного программного обеспечения и 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
,
Просто используйте промежуточное ПО.
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.
Предположим, у вас есть объект 'user' в 'req', а у '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)
});
и в вашем шаблоне Jade вы можете получить доступ к переменным сеанса, как это:
div.user-email #{session.user_email}
Если переменная объекта сеанса объявлена глобально, то в глобальном
вар сесс
В функции
сессия = req.session
req.render('index.pug',{сессия})