Валидация параметров

В 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 или более символов” или дополнительную функцию, проверяющую наличие и формат значения.


Рекомендации по валидации параметров

  1. Регулярные выражения для простых правил: числа, строки определенной длины, буквы.
  2. Функции для сложной логики: проверки диапазонов, форматов даты, наличия в базе данных.
  3. Комбинированный подход: использовать регулярные выражения для базовой фильтрации, функции — для сложной логики.
  4. Обработка ошибок: предусматривать маршруты или страницы для некорректных параметров.
  5. Документировать правила параметров: чтобы поддержка и расширение маршрутов оставались прозрачными.

Пример полной валидации

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 позволяет создавать надежные маршруты, защищенные от ошибок формата и логики, обеспечивая стабильность работы одностраничного приложения.