Передача переменных между middleware в Express.js
Быстрый ответ
В Express.js данные можно передавать между промежуточными обработчиками, добавляя свойства к объекту запроса (req
). Эти свойства будут доступны для последующих обработчиков через тот же объект req
.
Приведем пример с req.userDetails
:
app.use((req, res, next) => {
// Добавляем информацию о пользователе
req.userDetails = { name: 'Alice' };
next();
});
app.use((req, res) => {
// Получаем информацию о пользователе
console.log(req.userDetails); // Выведет: { name: 'Alice' }
});
Таким образом, данные просто передаются по цепочке обработчиков.
Элегантная передача переменных
Альтернативный подход, который считается более элегантным, предусматривает использование **res.locals**
.
Считайте res.locals
специализированной областью, предназначенной для хранения данных в рамках текущего запроса.
app.use((req, res, next) => {
res.locals.userDetails = { name: 'Alice' };
next();
});
app.use((req, res) => {
console.log(res.locals.userDetails); // Выведет { name: 'Alice' }
});
Этот метод позволяет предотвратить случайное удаление данных и помогает сохранить структуру запроса.
Понимание контекста
Не забывайте, что переменные в res.locals
доступны только в рамках текущего запроса. Это отличает их от app.locals
, который является глобальным для всех запросов. Такое ограничение области видимости предотвращает возможные конфликты имен переменных.
Меры предосторожности
Изменяйте req
только в крайнем случае. Если вы передаете множество данных через большое количество обработчиков, вероятно, ваш код стоит пересмотреть: это может быть признаком проблем с архитектурой.
Визуализация
Передачу данных через промежуточные обработчики в Express.js можно представить как пересадку с одного поезда на другой:
🚂: Промежуточный обработчик 1 – Данные передаются с информацией `res.locals.myData = { user: 'Alice' };`
🔄: next() – Пересадочная станция, переход на другой поезд
🚃: Промежуточный обработчик 2 – Данные доступны: `console.log(res.locals.myData); // { user: 'Alice' }`
🏁: Конечная станция – Финальный обработчик, где все заканчивается.
Функция next()
здесь выступает в качестве пересадочного пункта для ваших данных.
Приемы для плавных переходов
- Именование: Используйте уникальные имена, чтобы избежать конфликтов.
- Жизненный цикл: Очищайте
res.locals
после использования данных. - Логика промежуточных обработчиков: Для сложной логики обращайтесь к сервисам и модулям.
- Инструменты: Для специализированных задач используйте соответствующие промежуточные обработчики.
Примеры из реальной жизни
Примером может служить аутентификация пользователя: после проверки данных пароля их необходимо передать другим обработчикам. Для этих целей передача через res.locals
идеально подходит, и это не перегружает req
.
app.use(authenticateUser);
function authenticateUser(req, res, next) {
if (authenticated) {
res.locals.user = userDetails;
next();
} else {
// Ошибка аутентификации
}
}
app.use((req, res) => {
if (res.locals.user) {
console.log(`Добро пожаловать, ${res.locals.user.name}`);
}
});
Такое решение обеспечивает удобно поддерживаемую цепочку промежуточных обработчиков и комфорт работы с кодом.
Полезные материалы
- Использование промежуточных обработчиков в Express — официальная документация.
- trust proxy в Express.js — обсуждение на Stack Overflow.
- Понимание промежуточных обработчиков в Express.js — подробная статья.
- Функция next в Express — обсуждение на Stack Overflow.
- Промежуточный обработчик в Express – Flavio Copes — руководство по глобальной обработке ошибок.
- Express.js – freeCodeCamp — урок по созданию собственных обработчиков.
- Изучение промежуточных обработчиков в Express — видеоурок.