Валидация путей

Navigo — это лёгкая библиотека маршрутизации для JavaScript, позволяющая управлять переходами между страницами без перезагрузки. Важной частью маршрутизации является валидация путей, которая гарантирует корректное сопоставление URL с обработчиками маршрутов и предотвращает неожиданные ошибки при навигации.


Регистрация маршрутов с параметрами

Маршруты в Navigo могут содержать динамические сегменты, обозначаемые двоеточием (:). Например:

const router = new Navigo('/');

router.on('/user/:id', (params) => {
  console.log(params.id);
});

В этом примере :id — динамический параметр. Navigo автоматически выделяет значение из URL и передает его в обработчик через объект params.

Ключевые моменты:

  • Параметры всегда доступны в объекте params.
  • Динамический сегмент обязательно должен соответствовать части URL, иначе маршрут не сработает.

Регулярные выражения для строгой валидации

Navigo позволяет задавать регулярные выражения для динамических сегментов, чтобы ограничивать допустимые значения:

router.on('/user/:id(\\d+)', (params) => {
  console.log(params.id);
});

Здесь :id(\\d+) ограничивает значение только числами. Если URL будет /user/abc, маршрут не сработает.

Рекомендации:

  • Использовать регулярные выражения для идентификаторов, e-mail, кодов и любых строго структурированных данных.
  • Помнить о необходимости экранирования символов в строке JavaScript (\\ вместо \).

Валидация с помощью middleware

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

router.on('/dashboard/:section', (params, query, done) => {
  if (!['home', 'settings', 'profile'].includes(params.section)) {
    done(false); // Отмена маршрута
  } else {
    done(); // Продолжение маршрута
  }
});

Особенности:

  • Параметр done(false) предотвращает дальнейшую обработку маршрута.
  • Middleware может быть асинхронным, что позволяет делать запросы к серверу перед разрешением перехода.

Обработка необязательных сегментов

Navigo поддерживает необязательные сегменты с использованием скобок:

router.on('/search(/:query)', (params) => {
  console.log(params.query); // undefined, если сегмент отсутствует
});
  • Скобки () делают часть маршрута необязательной.
  • Это полезно для страниц с фильтрацией, поиском и параметрами сортировки.

Использование wildcard для валидации

Сегменты с символом * позволяют принимать произвольные значения:

router.on('/files/*path', (params) => {
  console.log(params.path);
});
  • Все символы после /files/ попадут в params.path.
  • Можно комбинировать с регулярными выражениями для частичной валидации.

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

Navigo предоставляет доступ к query-параметрам через второй аргумент обработчика:

router.on('/products', (params, query) => {
  if (!query.category) {
    console.warn('Не указана категория');
  }
});
  • query — объект с ключами и значениями параметров после ?.
  • Можно комбинировать с middleware для дополнительной проверки.

Советы по строгой валидации

  1. Всегда использовать регулярные выражения для идентификаторов и числовых сегментов.
  2. Применять middleware для проверки прав доступа или бизнес-логики.
  3. Проверять необязательные сегменты и query-параметры.
  4. При работе с wildcard учитывать потенциальные конфликты с другими маршрутами.
  5. Планировать структуру маршрутов, чтобы не допустить неоднозначных совпадений.

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

router.on('/orders/:orderId(\\d+)(/:action(edit|view))', (params, query, done) => {
  if (!params.action) params.action = 'view'; // Установить значение по умолчанию
  if (parseInt(params.orderId, 10) <= 0) {
    done(false); // Некорректный ID
  } else {
    done();
  }
});

В этом примере реализована:

  • Проверка числового orderId.
  • Ограничение значения action только на edit или view.
  • Обработка отсутствующего необязательного сегмента с установкой значения по умолчанию.

Итоговая структура

Строгая валидация путей в Navigo сочетает:

  • Динамические сегменты и регулярные выражения для базовой проверки URL.
  • Middleware для дополнительной логики и контроля доступа.
  • Обработка необязательных сегментов и query-параметров для гибкости.
  • Wildcard-сегменты для маршрутов с произвольной структурой.

Эти инструменты позволяют строить безопасные и предсказуемые маршруты, обеспечивая корректную навигацию внутри приложения.