Используйте экспресс сессию в Ejs от одного маршрута до другого - PullRequest
0 голосов
/ 18 октября 2019

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

То, что я сделал, я создал один nav.ejs, и эта навигация содержит следующие ссылки:

  1. Home
  2. Предложения
  3. Вход
  4. Выход

Но эти Offers и Logout ссылки будут отображаться только в случае успешного входа пользователя, в противном случае они будут скрыты иТо же самое верно для Signin. Я реализовал следующее в sign-in.js маршрутизации:

router.post('/', function(req, res) {
    var username = req.body.username;
    var password = req.body.password;
    var exe = `SELECT id FROM users WHERE username = ? AND password = ?`;
    dbConn.get(exe, [username, password], (err, rs) => {
        if (err) {
            console.log('Facing problem while finding users');
        } else {
            if (rs) {
                req.session.isLoggedIn = true;
                res.locals.isLoggedIn = true;
                res.redirect('/');
            } else {
                req.flash('err', 'incorrect credintials.');
                res.render('sign-in')
            }
        }
    });
});

Вы можете видеть там, я создаю сеанс, а также сохраняю значение в локальных.

req.session.isLoggedIn = true;
res.locals.isLoggedIn = true;

Innav.ejs файл, который я написал,

<nav>
    <a href="/">Home</a>
    <% if (locals.isLoggedIn == true) { %>
        <a href="/offers">Offers</a>
        <a href="/logout">Logout</a>
    <% } else { %>
        <a href="/sign-in">Sign-in</a>        
    <% } %>
</nav>

1 Ответ

0 голосов
/ 18 октября 2019

res.locals не сохраняется на следующем маршруте. Объект res применяется ТОЛЬКО к этому конкретному запросу. Только req.session будет сохранено для будущих маршрутов для этого пользователя. Вам придется переназначить res.locals на следующем маршруте, прежде чем вы наберете res.render() на следующем маршруте.

Итак, когда вы делаете это:

            req.session.isLoggedIn = true;
            res.locals.isLoggedIn = true;
            res.redirect('/');

res.redirect('/') отправляет ответ в браузер. Эта просьба теперь выполнена. Затем браузер обрабатывает перенаправление и отправляет НОВЫЙ запрос на сервер для маршрута /. Значение res.locals, которое вы только что установили, пропадет, когда новый маршрут / будет получен после того, как браузер обработает перенаправление.

Итак, на всех маршрутах, где вы хотите использовать данные сеанса впредставленный шаблон, прочитайте данные из req.session и установите res.locals в соответствии с шаблоном, который вы собираетесь визуализировать.

...