В Navigo маршруты могут содержать динамические сегменты, которые передаются как параметры. Для обеспечения корректной работы приложения крайне важно валидировать эти параметры, чтобы обработчики маршрутов получали данные ожидаемого типа и формата. Валидация параметров в Navigo строится на использовании регулярных выражений и функций-проверок, привязанных к конкретным маршрутам.
Динамический сегмент определяется с помощью двоеточия перед именем параметра:
const router = new Navigo('/');
router.on('/user/:id', (params) => {
console.log(params.id);
});
Здесь :id — это динамический сегмент. При обращении к
/user/42 объект params будет содержать
{ id: '42' }.
Чтобы гарантировать корректность значения, Navigo позволяет использовать регулярные выражения прямо в определении маршрута.
Регулярные выражения позволяют ограничить формат параметров.
Синтаксис: :paramName(регулярное_выражение).
Пример маршрута, где id должен быть только числом:
router.on('/user/:id(\\d+)', (params) => {
console.log(`Пользователь с ID ${params.id}`);
});
В этом примере \\d+ — регулярное выражение, разрешающее
только последовательность цифр. Если URL /user/abc —
обработчик маршрута не вызовется.
Ключевые моменты использования регулярных выражений:
\\) в строках
JavaScript.Navigo поддерживает дополнительную проверку параметров с помощью функций. В отличие от регулярных выражений, функция может выполнять более сложную логику, например, проверять диапазоны чисел или формат даты.
router.on('/order/:orderId', (params) => {
if (validateOrderId(params.orderId)) {
console.log(`Заказ ${params.orderId} найден`);
} else {
console.error('Неверный идентификатор заказа');
}
});
function validateOrderId(id) {
const number = parseInt(id, 10);
return !isNaN(number) && number > 0 && number < 10000;
}
Проверка через функцию дает полную свободу: можно проверять числовые диапазоны, существование объекта в базе, формат даты или комбинацию условий.
Для маршрутов с несколькими параметрами регулярные выражения можно комбинировать:
router.on('/user/:userId(\\d+)/post/:postId(\\d+)', (params) => {
console.log(`Пользователь ${params.userId} создал пост ${params.postId}`);
});
Если любой из параметров не соответствует регулярному выражению, обработчик не будет вызван.
Также можно дополнительно проводить валидацию через функции:
router.on('/user/:userId(\\d+)/post/:postId(\\d+)', (params) => {
if (isValidUser(params.userId) && isValidPost(params.postId)) {
showPost(params.userId, params.postId);
} else {
navigateToErrorPage();
}
});
Navigo поддерживает опциональные параметры, обозначаемые знаком
? в конце сегмента:
router.on('/search/:query?', (params) => {
const query = params.query || 'all';
console.log(`Поиск: ${query}`);
});
Для таких параметров можно использовать регулярные выражения с условием “0 или более символов” или дополнительную функцию, проверяющую наличие и формат значения.
router.on('/product/:category([a-z]+)/:id(\\d+)', (params) => {
if (!isValidCategory(params.category)) {
navigateToErrorPage();
return;
}
if (!isValidProductId(params.id)) {
navigateToErrorPage();
return;
}
displayProduct(params.category, params.id);
});
function isValidCategory(category) {
const allowed = ['books', 'electronics', 'clothing'];
return allowed.includes(category);
}
function isValidProductId(id) {
const number = parseInt(id, 10);
return number > 0 && number < 100000;
}
В этом примере комбинируются регулярные выражения для базовой фильтрации и функции для логической проверки, что обеспечивает надежную защиту от некорректных URL.
Валидация параметров в Navigo позволяет создавать надежные маршруты, защищенные от ошибок формата и логики, обеспечивая стабильность работы одностраничного приложения.