2013-06-20 2 views
4

Im с использованием NodeJS, ExpressJS, PassportJS и Jade.Проверка смены сессии в Jade View

У меня есть меню заголовка, в котором будет отображаться логин или выход из системы. Вход отображается, если пользователь еще не вошел в систему, и выйдите из системы, если пользователь уже выполнил вход.

Меню находится в отдельном файле нефрита: menu.jade и входит в остальные нефритовые файлы.

include menu 

В menu.jade, как я могу проверить, если пользователь уже вошел в систему? Могу ли я проверить переменную сеанса в нефрите? Что-то вроде ниже для menu.jade?

if (req.session.name != null) 
    a(href='/logout') Logout 
else 
    a(href='/login') Login 

Благодаря

ответ

7

Вы должны выставить сессию шаблонам. То, как я это делаю, что я кладу пользовательскую переменную в местных жителей:

Примечание: req.user устанавливается passportJS, вы можете увидеть их пример на него из here (in the bottom)
Примечание # 2: Подробнее о местных here

app.get('*', function(req, res, next) { 
    // put user into res.locals for easy access from templates 
    res.locals.user = req.user || null; 

    next(); 
}); 

, а затем в шаблоне вы можете сделать это:

- if(_user) { 
    div.menuForLoggedInUser 
- } else { 
    div.menuForLoggedOutUser 
- } 

Если вы не чувствуете, как подвергая весь пользовательский объект шаблонам, не стесняйтесь просто поставить «LoggedIn» для местных жителей и проверять т ... Что-то вроде этого, то:

app.get('*', function(req, res, next) { 
    // just use boolean for loggedIn 
    res.locals.loggedIn = (req.user) ? true : false; 

    next(); 
}); 

Edit: Спасибо robertklep за указание res.locals против app.locals

+1

Я считаю, что вам также нужно выставлять app.locals как locals при визуализации представления. (node.js и express в основном избегают «магии») –

+0

Моя реализация действительно немного испорчена. Вместо app.locals = {}; это должно быть app.locals ({}); (как указано в документах expressJS) –

+1

'app.locals' - это широкоэкранное приложение, вы не должны использовать его для хранения динамических данных, таких как' req.user' (потому что другие запросы могут перезаписать его). Вместо этого используйте ['res.locals'] (http://expressjs.com/api.html#res.locals). – robertklep

1

введу переменную, которая приведет к проверке вошедшего в

// routes/some.js 
exports.index = function (req, res) { 
    res.render('somepage', { 
     isAlreadyLoggedin: checkSessionSomeway() 
    }) 
} 

// menu.jade 
if (isAlreadyLoggedin != null) 
    a(href='/logout') Logout 
else 
    a(href='/login') Login 
.