Именованные параметры позволяют создавать динамические маршруты в
Page.js, которые могут принимать значения прямо из URL. Они обозначаются
двоеточием (:) перед именем параметра в пути маршрута и
позволяют извлекать данные для дальнейшей обработки.
page('/user/:id', ctx => {
console.log(ctx.params.id);
});
В этом примере маршрут /user/:id будет соответствовать
URL /user/123 или /user/abc, а объект
ctx.params будет содержать ключ id со
значением, переданным в URL. Это позволяет создавать универсальные
обработчики для разных значений параметров.
Page.js поддерживает маршруты с несколькими именованными параметрами. Каждый параметр указывается через двоеточие и разделяется слешем.
page('/user/:userId/post/:postId', ctx => {
console.log(ctx.params.userId); // ID пользователя
console.log(ctx.params.postId); // ID поста
});
При переходе на /user/42/post/100 объект
ctx.params будет выглядеть так:
{
userId: "42",
postId: "100"
}
Такой подход позволяет легко строить REST-подобные маршруты и получать необходимые данные из URL без использования дополнительных методов парсинга.
Именованные параметры могут быть опциональными, если поставить вопросительный знак после имени параметра. Это полезно для маршрутов, где часть пути может присутствовать, а может отсутствовать.
page('/user/:id?', ctx => {
console.log(ctx.params.id); // undefined, если параметр не указан
});
Примеры URL:
/user/123 → ctx.params.id =
"123"/user/ → ctx.params.id =
undefinedОпциональные параметры особенно полезны для фильтров, пагинации и других случаев, когда часть URL может быть необязательной.
Page.js позволяет задавать регулярные выражения для именованных
параметров, чтобы ограничивать допустимые значения. Синтаксис такой:
:имя(регэксп).
page('/order/:id(\\d+)', ctx => {
console.log(ctx.params.id); // только числа
});
Маршрут /order/123 сработает, а /order/abc
— нет. Использование паттернов повышает контроль над входящими данными и
снижает вероятность некорректного перехода.
ctx.params и его использованиеКаждое именованное значение автоматически добавляется в объект
ctx.params. Он доступен во всех обработчиках маршрута:
page('/product/:category/:id', ctx => {
const { category, id } = ctx.params;
fetchProduct(category, id).then(renderProduct);
});
Page.js выбирает первый маршрут, который совпадает с URL. Если есть маршруты с фиксированными сегментами и маршруты с параметрами, фиксированные маршруты должны быть определены раньше. Иначе параметр может перехватить URL.
page('/about', showAbout);
page('/about/:section', showSection);
page('/about'); // сработает showAbout, а не showSection
Неправильный порядок приведет к неожиданным совпадениям:
page('/about/:section', showSection);
page('/about', showAbout);
page('/about'); // сработает showSection с ctx.params.section = undefined
Именованные параметры отлично сочетаются с middleware Page.js. Middleware может обрабатывать параметры до основного обработчика.
function loadUser(ctx, next) {
const userId = ctx.params.id;
fetchUser(userId).then(user => {
ctx.user = user;
next();
});
}
page('/user/:id', loadUser, ctx => {
renderUser(ctx.user);
});
Здесь ctx.user создается на основе
ctx.params.id, а затем используется в основном обработчике.
Такой подход позволяет структурировать код, отделяя загрузку данных от
отображения.
: в URL.?) или ограничены
паттернами.ctx.params.Именованные параметры являются мощным инструментом для построения динамических маршрутов, позволяя создавать универсальные, REST-подобные и хорошо структурированные приложения на Page.js.