Middleware в контексте TanStack Router представляет собой механизм, позволяющий перехватывать переходы между маршрутами, выполнять дополнительную обработку и изменять поведение маршрутизации. Middleware полезен для аутентификации, логирования, контроля доступа, перезапроса данных и других задач, где требуется вмешательство в процесс навигации.
Middleware в TanStack Router работают на уровне маршрутов, то есть они могут быть привязаны как к отдельному маршруту, так и к группе маршрутов. Каждое такое промежуточное звено получает контекст маршрута, может выполнить асинхронные действия и контролировать дальнейший процесс перехода.
Ключевые моменты работы middleware:
Middleware реализуется как функция, принимающая объект контекста и возвращающая либо результат, либо промис. Стандартный синтаксис:
import { createRouter, RouterContext } from '@tanstack/router';
function authMiddleware({ context, next }) {
const isAuthenticated = context.user?.isLoggedIn;
if (!isAuthenticated) {
return context.router.navigate('/login');
}
return next();
}
Здесь:
context – объект, содержащий данные маршрута,
параметры, текущий router instance.next() – функция, которая передает управление
следующему middleware или завершает переход.Middleware можно подключать на нескольких уровнях:
const protectedRoute = createRoute({
path: '/dashboard',
component: Dashboard,
middleware: [authMiddleware],
});
const appRoutes = createRoute({
path: '/',
children: [
protectedRoute,
publicRoute,
],
middleware: [logMiddleware],
});
Middleware на уровне группы маршрутов выполняются до middleware отдельных маршрутов.
Порядок выполнения определяется иерархией маршрутов и порядком подключения middleware:
function roleMiddleware({ context, next }) {
if (context.user.role !== 'admin') {
return context.router.navigate('/not-authorized');
}
return next();
}
Проверяет роль пользователя и перенаправляет на страницу с сообщением о недостаточных правах доступа.
function logMiddleware({ context, next }) {
console.log(`Переход на маршрут: ${context.route.path}`);
return next();
}
Фиксирует все маршруты, на которые выполняется переход.
async function loadDataMiddleware({ context, next }) {
context.data = await fetchData(context.route.params.id);
return next();
}
Асинхронно загружает данные для компонента перед его рендером, сохраняя результат в контексте.
Middleware может быть асинхронным, что позволяет выполнять запросы к серверу, проверку токенов или авторизацию через API:
async function asyncAuth({ context, next }) {
try {
const isValid = await verifyToken(context.user.token);
if (!isValid) return context.router.navigate('/login');
} catch (err) {
return context.router.navigate('/error');
}
return next();
}
Ошибка в middleware может быть обработана через
try/catch или глобальный обработчик ошибок маршрутизатора,
что позволяет управлять поведением приложения в случае сбоев.
Контекст маршрута (context) используется для передачи
данных между middleware и компонентом маршрута:
function addUserData({ context, next }) {
context.userData = { name: 'Alex', role: 'admin' };
return next();
}
// В компоненте
function Dashboard({ context }) {
console.log(context.userData.name); // Alex
}
Таким образом, middleware становится мощным инструментом для подготовки состояния перед рендером компонентов.
Middleware в TanStack Router обеспечивает гибкий контроль над маршрутизацией, позволяя строить сложные приложения с защитой маршрутов, асинхронной загрузкой данных и централизованной обработкой переходов. Их грамотная организация повышает читаемость кода и облегчает поддержку масштабных проектов.