Логирование ошибок

Navigo — это легковесный клиентский роутер для JavaScript, который позволяет управлять навигацией без перезагрузки страницы. Одним из важных аспектов при работе с Navigo является обработка и логирование ошибок, возникающих при маршрутизации. Для этого библиотека предоставляет гибкие механизмы, позволяющие отслеживать неправильные URL, некорректные обработчики маршрутов или исключения в колбэках.

Использование колбэка notFound

Одной из базовых возможностей для перехвата ошибок является метод .notFound(handler). Он вызывается в случае, если текущий URL не соответствует ни одному зарегистрированному маршруту:

import Navigo from 'navigo';

const router = new Navigo('/');

router
  .on('/home', () => {
    console.log('Главная страница');
  })
  .on('/about', () => {
    console.log('О нас');
  })
  .notFound(() => {
    console.error('Маршрут не найден');
  })
  .resolve();

Особенности использования:

  • handler принимает функцию без аргументов, что позволяет централизованно логировать недопустимые маршруты.
  • Этот метод полезен для сбора статистики 404 ошибок на фронтенде.

Логирование исключений в обработчиках маршрутов

Маршруты в Navigo могут содержать сложную логику, включая асинхронные вызовы и динамическую подгрузку данных. Для корректного логирования ошибок рекомендуется оборачивать обработчики в блоки try...catch:

router.on('/profile/:id', async (params) => {
  try {
    const userData = await fetchUserData(params.id);
    renderProfile(userData);
  } catch (error) {
    console.error('Ошибка при загрузке профиля:', error);
  }
});

Ключевые моменты:

  • Всегда логировать объект error, чтобы сохранять стек вызовов.
  • Можно интегрировать с внешними сервисами аналитики, например Sentry или LogRocket, для централизованного сбора ошибок.

Глобальный обработчик ошибок навигации

Navigo позволяет добавлять пользовательские middleware через .hooks(). С помощью хука before можно перехватывать навигацию и логировать потенциальные ошибки до выполнения обработчика маршрута:

router.hooks({
  before(done, params) {
    try {
      validateParams(params);
      done();
    } catch (error) {
      console.error('Ошибка валидации параметров маршрута:', error);
      done(false);
    }
  }
});

Особенности:

  • Параметр done(false) предотвращает выполнение обработчика маршрута при ошибке.
  • Такой подход позволяет отлавливать ошибки до попадания в пользовательский интерфейс.

Интеграция с асинхронными маршрутами

Для маршрутов с динамической загрузкой компонентов или данных важно правильно обрабатывать промисы:

router.on('/dashboard', () => {
  import('./dashboard.js')
    .then(module => module.initDashboard())
    .catch(error => console.error('Ошибка при загрузке Dashboard:', error));
});

Особенности:

  • Использование .catch() для промисов гарантирует, что ошибки не останутся незамеченными.
  • Можно создавать универсальную функцию-обертку для маршрутов, автоматически логирующую исключения.

Пример расширенного логирования

Для сложных приложений полезно создавать централизованный модуль логирования:

function logError(context, error) {
  console.error(`[${context}]`, error);
  // Здесь можно добавить отправку ошибок на сервер
}

router.on('/settings', () => {
  try {
    loadSettings();
  } catch (error) {
    logError('Настройки', error);
  }
});

router.notFound(() => logError('Маршрут', 'Не найден'));

Преимущества:

  • Упрощается поддержка и масштабирование системы логирования.
  • Легко интегрируется с внешними инструментами мониторинга.

Советы по организации логирования

  • Разделять ошибки навигации и ошибки бизнес-логики, чтобы понимать источник проблемы.
  • Использовать стек вызовов (error.stack) для детальной диагностики.
  • Настраивать логирование на разных уровнях: консоль для разработки и удалённые сервисы для продакшена.
  • Обрабатывать асинхронные ошибки через промисы или async/await, чтобы избежать «потерянных» исключений.

Логирование ошибок в Navigo не ограничивается лишь выводом в консоль. Грамотное использование методов .notFound(), хуков и централизованных функций позволяет строить надежную архитектуру маршрутизации с прозрачным контролем ошибок.