Middleware в библиотеке Navigo представляет собой функцию или цепочку
функций, которые выполняются до или после обработки
маршрута. Это мощный инструмент для контроля потока навигации,
проверки прав доступа, логирования действий и модификации данных
запроса. В Navigo middleware реализуется через методы
before и after, а также через передачу
дополнительных функций при настройке маршрутов.
Ключевые особенности middleware:
Глобальные middleware назначаются через метод before. Он
принимает два аргумента:
Пример использования:
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 прямо при определении маршрута:
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 выполняются после глобальных, что позволяет строить многоуровневую проверку: сначала общие условия, затем специфичные для маршрута.
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(),
дальнейшее выполнение останавливается.
Методы after позволяют выполнять действия после
того, как маршрут был обработан. Это удобно для логирования,
аналитики и обновления интерфейса:
router.after((params, query) => {
console.log(`Маршрут ${params.route} был обработан`);
});
В отличие от before, метод after не
управляет переходом и выполняется всегда после маршрута.
Авторизация и аутентификация Использование
before для проверки наличия токена или прав доступа перед
открытием страницы.
Логирование действий пользователя Глобальные
after middleware для записи посещений маршрутов в
аналитическую систему.
Редиректы и маршрутизация по умолчанию Middleware может перенаправлять пользователей на нужные страницы в зависимости от состояния приложения.
Обработка параметров маршрута Можно валидировать
или модифицировать params и query перед
передачей в обработчик маршрута.
done() в
before 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 управляемым и масштабируемым.