Передача переменных между middleware в Express.js

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

В Express.js данные можно передавать между промежуточными обработчиками, добавляя свойства к объекту запроса (req). Эти свойства будут доступны для последующих обработчиков через тот же объект req.

Приведем пример с req.userDetails:

JS
Скопировать код
app.use((req, res, next) => {
  // Добавляем информацию о пользователе
  req.userDetails = { name: 'Alice' };
  next();
});

app.use((req, res) => {
  // Получаем информацию о пользователе
  console.log(req.userDetails); // Выведет: { name: 'Alice' }
});

Таким образом, данные просто передаются по цепочке обработчиков.

Кинга Идем в IT: пошаговый план для смены профессии

Элегантная передача переменных

Альтернативный подход, который считается более элегантным, предусматривает использование **res.locals**.

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

JS
Скопировать код
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 можно представить как пересадку с одного поезда на другой:

Markdown
Скопировать код
🚂: Промежуточный обработчик 1 – Данные передаются с информацией `res.locals.myData = { user: 'Alice' };`
🔄: next() – Пересадочная станция, переход на другой поезд
🚃: Промежуточный обработчик 2 – Данные доступны: `console.log(res.locals.myData); // { user: 'Alice' }`
🏁: Конечная станция – Финальный обработчик, где все заканчивается.

Функция next() здесь выступает в качестве пересадочного пункта для ваших данных.

Приемы для плавных переходов

  • Именование: Используйте уникальные имена, чтобы избежать конфликтов.
  • Жизненный цикл: Очищайте res.locals после использования данных.
  • Логика промежуточных обработчиков: Для сложной логики обращайтесь к сервисам и модулям.
  • Инструменты: Для специализированных задач используйте соответствующие промежуточные обработчики.

Примеры из реальной жизни

Примером может служить аутентификация пользователя: после проверки данных пароля их необходимо передать другим обработчикам. Для этих целей передача через res.locals идеально подходит, и это не перегружает req.

JS
Скопировать код
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}`);
  }
});

Такое решение обеспечивает удобно поддерживаемую цепочку промежуточных обработчиков и комфорт работы с кодом.

Полезные материалы

  1. Использование промежуточных обработчиков в Express — официальная документация.
  2. trust proxy в Express.js — обсуждение на Stack Overflow.
  3. Понимание промежуточных обработчиков в Express.js — подробная статья.
  4. Функция next в Express — обсуждение на Stack Overflow.
  5. Промежуточный обработчик в Express – Flavio Copes — руководство по глобальной обработке ошибок.
  6. Express.js – freeCodeCamp — урок по созданию собственных обработчиков.
  7. Изучение промежуточных обработчиков в Express — видеоурок.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Как можно передавать данные между промежуточными обработчиками в Express.js?
1 / 5