В библиотеке Navigo middleware — это функции, которые выполняются перед обработкой конкретного маршрута. Они позволяют выполнять общие действия для всех маршрутов, такие как проверка авторизации, логирование или подготовка данных. Глобальные middleware применяются ко всем маршрутам сразу и являются мощным инструментом для централизованного управления поведением приложения.
Глобальные middleware в Navigo задаются через метод
.hooks() при инициализации роутера или позже через
router.hooks(). Основные события, на которые можно повесить
middleware, это:
before — вызывается перед обработкой маршрута.after — вызывается после обработки маршрута.Пример подключения:
import Navigo from 'navigo';
const router = new Navigo('/', { hash: true });
router.hooks({
before: (done, match) => {
console.log('Проверка перед маршрутом:', match.url);
done(); // продолжение маршрутизации
},
after: (match) => {
console.log('Маршрут обработан:', match.url);
}
});
Пояснения к коду:
done — функция, которую необходимо вызвать для
продолжения навигации. Если она не вызывается, переход к маршруту
блокируется.match — объект, содержащий информацию о маршруте:
url, params, queryString.before для авторизацииОдна из типичных задач глобального middleware — проверка доступа пользователя. Можно реализовать глобальную проверку перед каждым маршрутом:
router.hooks({
before: (done, match) => {
const userLoggedIn = Boolean(localStorage.getItem('token'));
if (!userLoggedIn && match.url !== '/login') {
router.navigate('/login');
} else {
done();
}
}
});
Ключевые моменты:
router.navigate().done() разрешает продолжение маршрутизации.Глобальные middleware удобно использовать для логирования и аналитики. Например, запись переходов на маршруты:
router.hooks({
after: (match) => {
console.log(`Пользователь перешел на ${match.url}`);
sendAnalytics(match.url); // кастомная функция отправки данных
}
});
Особенности:
after вызывается после того, как
маршрут отработал.before middleware может быть асинхронным. Это удобно для
загрузки данных или проверки прав на сервере перед отображением
страницы:
router.hooks({
before: async (done, match) => {
try {
const hasAccess = await checkAccess(match.url); // проверка на сервере
if (hasAccess) {
done();
} else {
router.navigate('/403');
}
} catch (err) {
console.error('Ошибка проверки доступа:', err);
router.navigate('/error');
}
}
});
Особенности:
await для асинхронных
операций.done() только после завершения всех
проверок, иначе маршрутизация будет остановлена.Можно подключить несколько глобальных before или
after функций. Они выполняются последовательно в порядке
подключения:
router.hooks({
before: [
(done, match) => {
console.log('Первый middleware');
done();
},
(done, match) => {
console.log('Второй middleware');
done();
}
]
});
Особенности:
done(), последующие не
будут выполнены.В глобальных middleware объект match предоставляет всю
информацию о маршруте:
{
url: '/products/123',
queryString: 'ref=homepage',
params: { id: '123' },
data: {}
}
Использование match позволяет:
match.params).match.url).match.queryString).match.data.match.dataГлобальные middleware могут сохранять данные для использования в маршрутах:
router.hooks({
before: (done, match) => {
match.data.startTime = Date.now();
done();
},
after: (match) => {
const duration = Date.now() - match.data.startTime;
console.log(`Маршрут обработан за ${duration} мс`);
}
});
Такой подход позволяет:
before и
after.done() решает,
будет ли обработан маршрут.Глобальные middleware в Navigo создают мощный слой управления приложением, обеспечивая единообразную обработку логики, авторизации, аналитики и других повторяющихся задач без дублирования кода.