Universal Router строит маршрутизацию на основе
цепочки правил и функций обработки. Ошибки в маршрутах чаще всего
связаны с неправильным порядком определения маршрутов,
конфликтами путей и неожиданным поведением
функций action.
Для диагностики таких проблем важно использовать пошаговый
анализ маршрута. Основная техника — это логирование объекта
маршрута и промежуточных значений, передаваемых в функцию
resolve.
const router = new UniversalRouter(routes, {
resolveRoute(context, params) {
console.log('Маршрут:', context.route.path);
console.log('Параметры:', params);
return context.route.action ? context.route.action(context, params) : null;
}
});
Такое логирование позволяет точно определить, какой маршрут сработал
и какие параметры были извлечены из URL. Особенно это важно при работе с
динамическими сегментами (:id,
:slug) и опциональными параметрами.
Universal Router обрабатывает маршруты последовательно, от первого к последнему. Порядок маршрутов критически важен при наличии пересекающихся шаблонов:
const routes = [
{ path: '/users/:id', action: () => 'User Detail' },
{ path: '/users/new', action: () => 'New User' }
];
В этом примере /users/new никогда не сработает, так как
/users/:id перехватывает запрос первым. Решение — менять
порядок определения маршрутов:
const routes = [
{ path: '/users/new', action: () => 'New User' },
{ path: '/users/:id', action: () => 'User Detail' }
];
Ключевой момент: маршруты с конкретными путями всегда следует располагать выше, чем маршруты с динамическими параметрами.
Функции action в Universal Router могут возвращать
промисы, что приводит к асинхронной маршрутизации.
Ошибки часто возникают из-за незавершённых промисов или
необработанных исключений:
const routes = [
{
path: '/data/:id',
async action({ params }) {
const response = await fetch(`/api/data/${params.id}`);
if (!response.ok) throw new Error('Ошибка загрузки данных');
return response.json();
}
}
];
Для отладки важно:
action с помощью
try/catch.undefined может нарушить дальнейшую обработку.Конфликты часто проявляются при использовании переопределений
и вложенных маршрутов. Universal Router позволяет использовать
children для вложенной маршрутизации:
const routes = [
{
path: '/dashboard',
children: [
{ path: '', action: () => 'Dashboard Home' },
{ path: 'settings', action: () => 'Settings' }
]
}
];
Ошибки могут возникать, если:
/ — он рассматривается как
абсолютный и игнорирует родительский.action — это
допустимо, но может создать неожиданный результат, если отсутствует
default путь.Для системного анализа маршрутизации можно применять несколько методов:
path, name, action.router.resolve(url) и сравнивать результат.context с минимальными свойствами (pathname,
query) для локальной проверки action.Пример мокирования:
const context = { pathname: '/users/123', query: {} };
router.resolve(context.pathname).then(result => console.log(result));
Universal Router поддерживает глобальную обработку ошибок через
catch на промисе resolve. Это особенно полезно
для выявления необработанных маршрутов:
router.resolve('/unknown-path')
.then(result => console.log(result))
.catch(error => console.error('Ошибка маршрутизации:', error.message));
Типичные ошибки:
Route not found — путь не совпадает ни с одним
маршрутом.action — нужно проверять и
логировать./, если они должны быть
относительными.resolve.catch для глобальной обработки
ошибок, чтобы видеть необработанные пути и исключения.Эти методы позволяют выявлять и исправлять большинство проблем с маршрутизацией в Universal Router, обеспечивая предсказуемое поведение приложения.