Инспекция контекста

В библиотеке 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-параметрами

Query-параметры доступны через ctx.querystring. Для удобства их часто парсят с помощью URLSearchParams:

page("/search", (ctx) => {
  const query = new URLSearchParams(ctx.querystring);
  console.log("Параметр запроса q:", query.get("q"));
});

Использование состояния между middleware

Объект 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 и маршрутами, чтобы избежать глобальных переменных.
  • Проверять наличие параметров и query-параметров перед использованием.
  • При сложной логике маршрутизации выводить полный контекст для отладки.
  • Использовать редиректы через ctx.redirect вместо прямого изменения window.location, чтобы сохранить работу Page.js и историю браузера.

Инспекция и управление контекстом — ключевой инструмент для построения масштабируемых приложений на Page.js, обеспечивающий чёткую структуру данных и согласованное состояние между маршрутами.