Композиция middleware

Middleware в библиотеке Navigo представляет собой функцию или цепочку функций, которые выполняются до или после обработки маршрута. Это мощный инструмент для контроля потока навигации, проверки прав доступа, логирования действий и модификации данных запроса. В Navigo middleware реализуется через методы before и after, а также через передачу дополнительных функций при настройке маршрутов.

Ключевые особенности middleware:

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

Глобальные Middleware

Глобальные middleware назначаются через метод before. Он принимает два аргумента:

  1. Функцию middleware.
  2. Опции фильтрации по маршруту (опционально).

Пример использования:

import Navigo from 'navigo';

const router = new Navigo('/');

router.before((done, params, query) => {
  console.log('Глобальная проверка перед маршрутом');
  if (!params.user) {
    console.log('Пользователь не авторизован, перенаправление на /login');
    router.navigate('/login');
    return;
  }
  done();
});
  • done — функция обратного вызова, которую необходимо вызвать для продолжения навигации.
  • params — объект с параметрами маршрута.
  • query — объект с параметрами запроса.

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

router.before((done) => {
  console.log('Проверка только для маршрутов /dashboard/*');
  done();
}, { only: ['/dashboard/*'] });

only и except позволяют точно контролировать, на каких маршрутах middleware будет выполнен или исключен.


Локальные Middleware

Для отдельных маршрутов можно передавать middleware прямо при определении маршрута:

router.on('/profile/:id', (params) => {
  console.log(`Открыт профиль пользователя ${params.id}`);
}, {
  before: (done, params) => {
    if (!params.id) {
      console.log('ID пользователя отсутствует, переход на /error');
      router.navigate('/error');
      return;
    }
    done();
  }
});

Локальные middleware выполняются после глобальных, что позволяет строить многоуровневую проверку: сначала общие условия, затем специфичные для маршрута.


Middleware цепочки

Navigo поддерживает цепочки middleware, позволяя использовать несколько функций для одного маршрута. Это достигается передачей массива функций:

const checkAuth = (done, params) => {
  if (!params.user) {
    router.navigate('/login');
    return;
  }
  done();
};

const logAccess = (done, params) => {
  console.log(`Доступ к маршруту ${params.route} разрешен`);
  done();
};

router.on('/dashboard', () => {
  console.log('Dashboard открыт');
}, { before: [checkAuth, logAccess] });

Порядок вызова важен: middleware выполняются последовательно, и если какой-либо не вызовет done(), дальнейшее выполнение останавливается.


Middleware после маршрута

Методы after позволяют выполнять действия после того, как маршрут был обработан. Это удобно для логирования, аналитики и обновления интерфейса:

router.after((params, query) => {
  console.log(`Маршрут ${params.route} был обработан`);
});

В отличие от before, метод after не управляет переходом и выполняется всегда после маршрута.


Практические сценарии применения

  1. Авторизация и аутентификация Использование before для проверки наличия токена или прав доступа перед открытием страницы.

  2. Логирование действий пользователя Глобальные after middleware для записи посещений маршрутов в аналитическую систему.

  3. Редиректы и маршрутизация по умолчанию Middleware может перенаправлять пользователей на нужные страницы в зависимости от состояния приложения.

  4. Обработка параметров маршрута Можно валидировать или модифицировать params и query перед передачей в обработчик маршрута.


Важные рекомендации

  • Не забывать вызывать done() в before middleware, иначе навигация будет заблокирована.
  • Минимизировать тяжёлые операции в синхронном блоке middleware, чтобы не замедлять роутер.
  • Использовать разделение на глобальные и локальные middleware, чтобы облегчить поддержку сложных приложений.
  • При цепочках middleware использовать чистые функции, чтобы каждый шаг был предсказуемым и независимым.

Интеграция с асинхронными операциями

Navigo поддерживает асинхронные действия через промисы или асинхронные функции:

router.before(async (done, params) => {
  const hasAccess = await checkUserAccess(params.user);
  if (!hasAccess) {
    router.navigate('/login');
    return;
  }
  done();
});

Это позволяет интегрировать middleware с API-запросами, базой данных или внешними сервисами без блокировки основного потока маршрутизации.


Резюме по композиции

Middleware в Navigo — это гибкий механизм, позволяющий:

  • управлять потоком переходов;
  • проверять условия доступа;
  • вести логирование;
  • строить асинхронные проверки;
  • объединять функции в цепочки для модульной архитектуры.

Правильное использование глобальных и локальных middleware, их последовательное выполнение и корректная интеграция с асинхронными задачами делает роутинг в Navigo управляемым и масштабируемым.