Доступ к req или сеансу Express.js из шаблона Jade - PullRequest
25 голосов
/ 13 июня 2011

Мне интересно, есть ли простой способ получить доступ к переменным req или сеанса Express.js из шаблона Jade, не передавая его через обычный ответ.

Или это единственный способ?

res.render('/', {
    session: req.session
});

Ответы [ 7 ]

53 голосов
/ 28 сентября 2013

Просто добавьте

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}
46 голосов
/ 27 ноября 2012

В 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.

20 голосов
/ 13 июня 2011

Вам нужно будет создать dynamicHelper для использования Express.

app.dynamicHelpers({
    session: function (req, res) {
        return req.session;
    }
});

Тогда внутри вашего шаблона вы можете использовать <%= session.logged_in %> или любой другой.

Примечание: dynamicHelpers устарела в Express 3

3 голосов
/ 21 марта 2013

просто используйте промежуточное ПО.

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}» для ссылки на него в нефритовом шаблоне.

Предположим, у вас есть объект 'user' в 'req', а у 'user' есть метод 'isAnonymous', если ваш user.isAnonymous () возвращает true,

p #{req.user.isAnonymous()}

будет отображаться как:

<p>true</p>
2 голосов
/ 09 июля 2017

это сработало для меня

app.use(function(req,res,next){
   res.locals.user = req.user;
   next();
});

в режиме просмотра мопса или нефрита

#{user.email}
1 голос
/ 13 июня 2011

Несмотря на то, что в javascript всегда есть возможность выйти из области видимости и ползти вверх, я действительно действительно действительно действительно действительно сильно призываю вас найти другой путь.

Подумайте над тем, что вы спрашиваете: могу ли я узнать мнение о внутренностях моего контроллера?

Или то, что вы на самом деле спрашиваете: могу ли я узнать мнение о внутренностях моего времени выполнения?

Предполагается, что представление берет данные и преобразует их в разметку. Вот и все. Если вы делаете что-то еще, вы делаете это неправильно. Мне все равно, насколько это "легко". В этом смысл интерфейса. Чтобы точно определить, что передается, и упростить замену одной вещи на другую.

0 голосов
/ 19 октября 2017

Вы можете решить эту проблему с помощью функции рендеринга, в которой вы используете для рендеринга каждое представление, которому нужна переменная сеанса в качестве локальной переменной, доступной в шаблоне (обычно, когда пользователь вошел в систему, например).

Вот пример функции, но вы можете настроить ее так, как вам нравится:

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}
...