Параметры с ограничениями

Библиотека Page.js позволяет создавать маршруты с динамическими параметрами, которые можно ограничивать с помощью регулярных выражений. Это даёт возможность точно контролировать, какие URL будут соответствовать определённым обработчикам.

Динамические параметры

Динамический параметр обозначается через двоеточие :. Например:

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

В этом примере маршрут /user/123 создаст объект ctx.params с ключом id и значением '123'.

Ограничение параметров регулярными выражениями

Для ограничения допустимых значений параметра можно использовать круглые скобки с регулярным выражением. Синтаксис: :параметр(регулярное_выражение).

Пример:

page('/order/:orderId(\\d+)', ctx => {
  console.log(ctx.params.orderId); // Только числа
});
  • \\d+ — регулярное выражение, разрешающее только последовательности цифр.
  • Если URL не соответствует шаблону (например, /order/abc), маршрут не сработает.

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

page('/product/:category([a-z]+)/:id(\\d+)', ctx => {
  console.log(ctx.params.category, ctx.params.id);
});

В этом примере:

  • category допускает только строчные буквы ([a-z]+).
  • id допускает только цифры (\d+).

Маршруты вида /product/electronics/42 будут работать, а /product/123/abc — нет.

Необязательные параметры с ограничениями

Page.js поддерживает необязательные параметры через знак ?. Регулярные выражения применяются только при наличии параметра.

page('/search/:query([a-zA-Z0-9]+)?', ctx => {
  console.log(ctx.params.query);
});
  • Если URL /search/, ctx.params.query будет undefined.
  • Если URL /search/laptop123, ctx.params.query вернёт 'laptop123'.

Параметры с альтернативами

Регулярные выражения позволяют задавать набор допустимых значений через оператор |:

page('/color/:type(red|green|blue)', ctx => {
  console.log(ctx.params.type);
});
  • Будут срабатывать только URL /color/red, /color/green, /color/blue.
  • /color/yellow не соответствует маршруту.

Встроенные проверки и ошибки

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

page('/post/:id(\\d+)', ctx => {
  // Этот код выполнится только если id — число
});
  • В обработчике можно быть уверенным, что ctx.params.id соответствует регулярному выражению.
  • Нет необходимости писать дополнительную проверку типа if (isNaN(ctx.params.id)).

Совмещение нескольких ограничений

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

page('/user/:id(\\d+)/:tab(posts|comments)?', ctx => {
  console.log(ctx.params.id, ctx.params.tab);
});
  • /user/10/posts{id: "10", tab: "posts"}
  • /user/10/comments{id: "10", tab: "comments"}
  • /user/10/{id: "10", tab: undefined}
  • /user/abc/posts → не срабатывает

Практические рекомендации

  • Использовать регулярные выражения только для простых ограничений: цифры, буквы, небольшие наборы альтернатив.
  • Для сложных валидаций лучше принимать параметр как есть и проверять внутри обработчика.
  • Необязательные параметры следует размещать в конце маршрута, чтобы не ломать сопоставление с другими маршрутами.
  • Всегда экранировать символы в регулярных выражениях (\\d вместо \d) из-за особенностей синтаксиса строки в JavaScript.

Резюме по синтаксису

Синтаксис Описание
:param Динамический параметр без ограничений
:param(regex) Динамический параметр с регулярным выражением
:param? Необязательный параметр
:param(regex)? Необязательный параметр с ограничением
:param(val1 | val2 | val3) Параметр с альтернативными значениями

Этот подход позволяет создавать чёткие и предсказуемые маршруты, исключая ошибки при передаче неправильных параметров и упрощая обработку URL в приложении на Page.js.