В библиотеке Page.js контекст представляет собой объект, который содержит всю информацию о текущем маршруте: путь, параметры, состояние запроса и другие данные, доступные обработчикам. Контекст передаётся каждому middleware и обработчику маршрута, позволяя централизованно управлять логикой приложения.
Ключевые свойства контекста (ctx) в Page.js
включают:
ctx.path – полный путь запроса,
включая query-параметры.ctx.pathname – путь без
query-параметров.ctx.querystring – строка запроса после
?.ctx.params – объект с параметрами
маршрута, заданными через : в пути.ctx.state – объект для хранения
состояния между middleware.ctx.title – позволяет задавать
заголовок страницы.ctx.save – функция для сохранения
состояния при переходе.ctx.redirect(path) – метод для
перенаправления на другой маршрут.Пример объекта контекста при маршруте
/user/:id?active=true:
{
path: "/user/123?active=true",
pathname: "/user/123",
querystring: "active=true",
params: { id: "123" },
state: {}
}
Middleware предоставляет возможность проверять и изменять контекст перед вызовом финального обработчика. Это позволяет реализовать авторизацию, логирование, обработку ошибок и динамическое состояние.
page((ctx, next) => {
console.log("Текущий путь:", ctx.path);
ctx.state.user = { id: 123, name: "Иван" };
next();
});
page("/dashboard", (ctx) => {
console.log("Пользователь в контексте:", ctx.state.user.name);
});
В этом примере ctx.state.user становится доступным в
маршруте /dashboard. Все middleware вызываются
последовательно, передавая один и тот же объект контекста.
Параметры маршрута автоматически извлекаются Page.js и помещаются в
ctx.params. Они задаются через двоеточие в шаблоне
пути.
page("/product/:id", (ctx) => {
const productId = ctx.params.id;
console.log("ID продукта:", productId);
});
Параметры могут быть как обязательными, так и опциональными:
page("/user/:id/:tab?", (ctx) => {
console.log("ID пользователя:", ctx.params.id);
console.log("Вкладка:", ctx.params.tab || "default");
});
Query-параметры доступны через ctx.querystring. Для
удобства их часто парсят с помощью URLSearchParams:
page("/search", (ctx) => {
const query = new URLSearchParams(ctx.querystring);
console.log("Параметр запроса q:", query.get("q"));
});
Объект ctx.state предназначен для хранения данных,
которые должны быть доступны нескольким middleware или обработчику
маршрута.
page((ctx, next) => {
ctx.state.isLoggedIn = true;
next();
});
page("/profile", (ctx) => {
if (ctx.state.isLoggedIn) {
console.log("Доступ разрешён");
}
});
Метод ctx.redirect(path) позволяет перенаправлять
пользователя на другой маршрут, изменяя контекст и автоматически вызывая
новый набор middleware для нового пути.
page("/old-path", (ctx) => {
ctx.redirect("/new-path");
});
Для отладки полезно выводить полный контекст маршрута:
page("*", (ctx) => {
console.log("Контекст маршрута:", ctx);
});
Это позволяет отследить все доступные свойства объекта и их текущее состояние. Такой подход особенно полезен при сложной логике маршрутизации с множеством middleware.
Метод ctx.save(key, value) позволяет сохранять
состояние, которое будет доступно при последующих переходах без
использования глобальных переменных:
page("/step1", (ctx, next) => {
ctx.save("formData", { name: "Иван" });
next();
});
page("/step2", (ctx) => {
const data = ctx.state.formData;
console.log("Данные формы:", data);
});
ctx.state для передачи данных между
middleware и маршрутами, чтобы избежать глобальных переменных.ctx.redirect вместо
прямого изменения window.location, чтобы сохранить работу
Page.js и историю браузера.Инспекция и управление контекстом — ключевой инструмент для построения масштабируемых приложений на Page.js, обеспечивающий чёткую структуру данных и согласованное состояние между маршрутами.