В библиотеке Page.js обработчики маршрутов (middleware-функции) играют центральную роль в управлении навигацией и состоянием приложения. В отличие от классических функций, где возвращаемое значение часто используется напрямую, в Page.js подход к возврату значений имеет особенности, связанные с асинхронностью, цепочками middleware и управлением потоком выполнения.
Функции-обработчики маршрутов в Page.js не используют возвращаемые значения в традиционном смысле. Любое значение, возвращаемое из обработчика, игнорируется библиотекой.
page('/home', () => {
return 'Hello';
});
В данном примере строка 'Hello' никак не влияет на
поведение маршрута.
Ключевая идея: управление осуществляется через побочные эффекты, а не через возвращаемые значения.
ctx как основной канал передачи данныхВместо возврата значений используется объект контекста
(ctx), который передаётся во все обработчики маршрута.
page('/user/:id', (ctx, next) => {
ctx.userId = ctx.params.id;
next();
}, (ctx) => {
console.log(ctx.userId);
});
Особенности:
ctx сохраняет состояние между middlewareТаким образом, ctx выполняет роль “контейнера” вместо
возвращаемых значений.
next()Функция next() определяет переход к следующему
middleware. Это важнее, чем возврат значения.
page('/example', (ctx, next) => {
if (!ctx.loggedIn) return;
next();
}, () => {
console.log('Авторизованный пользователь');
});
Здесь:
next() прерывает цепочкуreturn используется только для выхода из функции, а не
передачи значенияПри использовании async/await возвращаемое значение
также не имеет значения для Page.js.
page('/data', async (ctx, next) => {
const data = await fetch('/api/data').then(r => r.json());
ctx.data = data;
next();
});
Даже если функция возвращает значение:
return data;
оно не будет использовано.
Для обработки исключительных ситуаций применяется выбрасывание ошибок:
page('/secure', (ctx, next) => {
if (!ctx.user) {
throw new Error('Unauthorized');
}
next();
});
Либо используется специальный маршрут обработки ошибок:
page('*', (ctx) => {
console.error('Ошибка маршрута');
});
Возвращаемые значения здесь не участвуют — управление идёт через исключения или изменение маршрута.
Возвращаемое значение может использоваться только для локального контроля выполнения функции:
page('/test', (ctx, next) => {
if (ctx.skip) return;
next();
});
Это не влияет на Page.js напрямую, а лишь завершает выполнение текущего обработчика.
| Подход | Возвращаемое значение | Основной механизм |
|---|---|---|
| Обычные функции | Используется | return |
| Express middleware | Не используется | next() |
| Page.js | Игнорируется | ctx + next() |
В цепочках обработчиков возврат значений полностью заменён передачей
данных через ctx:
page('/chain',
(ctx, next) => {
ctx.step1 = true;
next();
},
(ctx, next) => {
ctx.step2 = ctx.step1;
next();
},
(ctx) => {
console.log(ctx.step2); // true
}
);
Каждый этап:
ctxРедиректы также не используют возвращаемые значения:
page('/old', () => {
page.redirect('/new');
});
Даже если вернуть значение после редиректа, оно не будет обработано.
1. Ожидание возврата данных
const result = page('/route', () => 'data');
result будет undefined.
2. Попытка использовать return для передачи состояния
return { user: 'admin' };
Такая конструкция не имеет смысла в контексте Page.js.
3. Пропуск next()
page('/broken', (ctx, next) => {
ctx.value = 1;
// next() не вызван
});
Цепочка остановится, даже если есть следующий обработчик.
ctx как единственный способ передачи
данныхnext() для управления порядком
выполненияreturnreturn только для досрочного выхода из
функцииОдин из распространённых подходов — последовательное накопление данных:
page('/profile',
async (ctx, next) => {
ctx.user = await getUser();
next();
},
async (ctx, next) => {
ctx.posts = await getPosts(ctx.user.id);
next();
},
(ctx) => {
renderProfile(ctx.user, ctx.posts);
}
);
Каждый middleware:
ctxВ Page.js отсутствует концепция значимых возвращаемых значений из обработчиков маршрутов. Архитектура строится на трёх принципах:
ctx) — хранение и передача
данныхnext()) —
управление потокомТакой подход делает маршрутизацию гибкой и предсказуемой, особенно в сложных одностраничных приложениях.