Как мне сохранить переменную для каждого маршрута в Express.js? - PullRequest
1 голос
/ 12 мая 2019

Итак, я создаю простое приложение для аутентификации и использую экспресс-сессии для этого. Для пользовательского интерфейса мне нужно отобразить в навигационной панели кнопку для входа, если пользователь еще не сделал этого, и кнопку для выхода, если они уже вошли в систему.

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

/* GET home page. */
router.get('/', function(req, res, next) {
  var logged_in = false;
  if (req.session.userId) {
    logged_in = true;
  }
  res.render('general/index', { is_logged_in: logged_in});
});

А в навигационной панели я динамически отображаю кнопки так:

<% if( is_logged_in){ %>
<li class="nav-item active">
<a class="nav-link" href="/users/logout">Logout<span class="sr-only">(current)</span></a>
</li>
<% } else { %>  
<li class="nav-item active">
<a class="nav-link" href="/login">Login<span class="sr-only">(current)</span></a>
</li>
<% } %>

Но проблема в том, что я должен использовать один и тот же код для каждого маршрута, если я хочу, чтобы это работало для навигационной панели, что противоречит методам DRY-кодирования. Как динамически отобразить эту кнопку без необходимости повторять один и тот же бит кода на каждом маршруте, проверяя, существует ли идентификатор сеанса пользователя? Я устанавливаю глобальную переменную? Я новичок в экспрессе, поэтому вся помощь приветствуется. Спасибо

1 Ответ

2 голосов
/ 12 мая 2019

Вы можете настроить промежуточное ПО для установки статуса входа в систему и использовать res.locals в течение срока действия запроса.

function checkLoggedIn(req, res, next) {
  var logged_in = false;
  if (req.session.userId) {
    res.locals.logged_in = true;
  }
}

Затем вы можете смонтировать его для всех маршрутов или связать его для некоторых маршрутов:

// all routes after this middleware:
app.use(checkLoggedIn)

// chain it
app.get('/mypath', checkLoggedIn, (req, res) => { ... })

res.locals доступны для просмотра, так что вы можете делать следующее, не проходя во время рендеринга.

// You can simply render
res.render('general/index');

// logged_in variable is available to view
<% if(logged_in){ %>
...