Мне интересно, есть ли простой способ получить доступ к переменным req или сеансам Express.js из шаблона Jade, не передавая его через обычный ответ.
Или это единственный способ?
res.render('/', {
session: req.session
});
Мне интересно, есть ли простой способ получить доступ к переменным req или сеансам Express.js из шаблона Jade, не передавая его через обычный ответ.
Или это единственный способ?
res.render('/', {
session: req.session
});
Вам понадобится создать dynamicHelper
для Express для использования.
app.dynamicHelpers({
session: function (req, res) {
return req.session;
}
});
Затем внутри вашего шаблона вы можете использовать <%= session.logged_in %>
или что-то еще.
Примечание: dynamicHelpers устарели в Express 3
В экспресс-версии 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(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", а "пользователь" имеет метод "isAnonymous", если ваш user.isAnonymous() возвращает true,
p #{req.user.isAnonymous()}
будет отображаться как:
<p>true</p>
Несмотря на то, что в javascript всегда есть способ избежать области и обхода вверх, я действительно действительно действительно действительно действительно настоятельно рекомендую вам найти другой способ.
Подумайте, о чем вы спрашиваете: могу ли я узнать свое мнение о кистях моего контроллера?
Или то, что вы действительно спрашиваете: могу ли я узнать о мучениях моей среды выполнения?
Предполагается, что представление должно принимать данные и преобразовывать их в разметку. Это. Если вы делаете что-то еще, вы делаете это неправильно. Меня не волнует, как это "легко". Это точка интерфейса. Чтобы точно определить, что передается, и упростить замену одной вещи другой.
это сработало для меня
app.use(function(req,res,next){
res.locals.user = req.user;
next();
});
в пользовательском интерфейсе мопса или нефрита
#{user.email}
Вы можете решить эту проблему с помощью функции рендеринга, в которой вы используете визуализацию каждого представления, для которого требуется переменная сеанса, в качестве локальной переменной, доступной в шаблоне (обычно, когда пользователь зарегистрирован, например).
Вот пример функции, но вы можете настроить, как вам нравится:
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}