Робота із сесією
Сесія зручніший спосіб збереження стану для сервера. Щоб реалізувати сесію треба зберігати якусь мітку на стороні клієнта, інакше сервер просто не зрозуміє, що запити йдуть від того самого клієнта. А значить cookie-файл з унікальним ідентифікатором якраз підходить нам і сервер використовуючи ідентифікатор зможе реалізувати сесію.
Модуль express-session надає нам API для реалізації сесії. Розглянемо налаштування цього модуля Він приймає конфігураційний об'єкт із наступними опціями.
resave - зазвичай встановлюють його у стан
false
. Параметр відповідає за збереження у сховищі сесії, навіть якщо запит не змінювався.saveUninitialized
- теж зазвичай встановлюють у стан false, оскільки запитують користувача дозвіл на встановлення cookie-файлу. Параметр вtrue
призводить до збереження нових сесій у сховищі, навіть якщо вони не змінювалися.secret
- секретний ключ для підписання cookie-файлу ідентифікатора сесії.key
- ім'я cookie-файлу за замовчуваннямconnect.sid
, у ньому зберігається унікальний ідентифікатор сесії.store
- це примірник сеансового сховища. За замовчуванням сесія зберігається в пам'яті - екземплярMemoryStore
, що цілком підходить для розробки та навчання, наших поточних цілей. Але в продакшені ми використовуємо як сховища бази даних, найчастіше це Redis (можливо і MongoDb або інша база). Це робиться для того, щоб при перезавантаженні сервера ми не втрачали поточні сеанси користувачів.cookie
- ті ж налаштування, що ми використовували для модуля cookie-parser
Давайте в нашу програму додамо сеанс. Він буде виводити лічильник перегляду сторінки для поточного користувача.
Спочатку ми ініціалізуємо сеансовий проміжний компонент із необхідними
параметрами: secret
, resave
та saveUninitialized
.
app.use(
require('express-session')({
resave: false,
saveUninitialized: false,
secret: process.env.SECRET_KEY,
}),
);
Управління даними у express-session реалізовано досить просто. Ми
привласнюємо об'єкту req.session
, необхідні нам властивості. Вони зберігаються
після виконання запиту. Ці властивості будуть завантажені під час вступу
наступних запитів від того ж користувача.
Щоб зберегти кількість переглядів, треба задати req.session.views
необхідне значення. І при зверненні до якості req.session.views
в
наступних запитах, нам доступне попереднє значення і ми будемо його просто
щоразу збільшувати.
У файл шаблону додамо наступний рядок
<p>Кількість переглядів цієї сторінки: <%= views %></p>
Перепишемо обробник роутера для головної сторінки
router.get('/', (req, res, next) => {
req.session.views = req.session.views === void 0 ? 0 : ++req.session.views;
res.render('index', {
title: 'Simple express app',
views: req.session.views,
});
});
І тепер щоразу оновлюючи сторінку лічильник збільшуватиметься на одиницю.
Якщо вам для якихось цілей потрібно реалізувати знищення сесії, необхідно викликати
req.session.destroy(function (err) {
// cannot access session here
});
Приклад програми:
Щоб програма повноцінно працювала, обов'язково відкрийте її в окремому вікні. Зараз воно працює як фрейм на сторінці.