Что такое UnhandledPromiseRejectionWarning?

Ошибка UnhandledPromiseRejectionWarning возникает в Node.js, когда промис отклоняется (rejected), но ошибка не обрабатывается с помощью .catch() или try-catch.

Причины возникновения

  • Отсутствие обработки ошибок в промисах
  • Забытые .catch() блоки
  • Неправильное использование async/await
  • Ошибки в асинхронных операциях

Как отладить ошибку

  1. Проверь обработку ошибок в промисах - добавь .catch() блоки
  2. Проверь async/await функции - используй try-catch
  3. Добавь глобальный обработчик - для отлова необработанных ошибок
  4. Проверь асинхронные операции - убедись в правильной обработке

Как исправить ошибку

1. Добавь .catch() к промисам

 1// Неправильно
 2fetch('/api/data')
 3    .then(response => response.json())
 4    .then(data => console.log(data));
 5
 6// Правильно
 7fetch('/api/data')
 8    .then(response => response.json())
 9    .then(data => console.log(data))
10    .catch(error => {
11        console.error('Ошибка при получении данных:', error);
12    });

2. Используй try-catch с async/await

 1// Неправильно
 2async function getData() {
 3    const response = await fetch('/api/data');
 4    const data = await response.json();
 5    return data;
 6}
 7
 8// Правильно
 9async function getData() {
10    try {
11        const response = await fetch('/api/data');
12        if (!response.ok) {
13            throw new Error(`HTTP error! status: ${response.status}`);
14        }
15        const data = await response.json();
16        return data;
17    } catch (error) {
18        console.error('Ошибка при получении данных:', error);
19        throw error; // или обработай ошибку по-другому
20    }
21}

3. Добавь глобальный обработчик

 1// Глобальный обработчик для необработанных отклонений
 2process.on('unhandledRejection', (reason, promise) => {
 3    console.error('Необработанное отклонение промиса:', reason);
 4    console.error('Промис:', promise);
 5    // Здесь можно добавить логирование или отправку в систему мониторинга
 6});
 7
 8// Глобальный обработчик для необработанных исключений
 9process.on('uncaughtException', (error) => {
10    console.error('Необработанное исключение:', error);
11    process.exit(1); // Завершаем процесс при критических ошибках
12});

4. Используй Promise.allSettled для множественных промисов

 1// Неправильно
 2const promises = [fetch('/api/users'), fetch('/api/posts')];
 3Promise.all(promises)
 4    .then(results => console.log(results));
 5
 6// Правильно
 7const promises = [fetch('/api/users'), fetch('/api/posts')];
 8Promise.allSettled(promises)
 9    .then(results => {
10        results.forEach((result, index) => {
11            if (result.status === 'fulfilled') {
12                console.log(`Промис ${index} выполнен:`, result.value);
13            } else {
14                console.error(`Промис ${index} отклонен:`, result.reason);
15            }
16        });
17    });

Как мониторить подобные ошибки

  • Настрой логирование unhandledRejection событий
  • Используй системы мониторинга ошибок (Sentry, LogRocket)
  • Настрой алерты на необработанные отклонения
  • Мониторь производительность асинхронных операций

FAQ

В: Когда возникает эта ошибка?

О: Ошибка возникает при разработке и выполнении, когда промис отклоняется без обработки ошибки.

В: Как предотвратить эту ошибку?

О: Следуй best practices и всегда добавляй обработку ошибок к промисам с .catch() или try-catch.

В: Какие инструменты помогают диагностировать ошибку?

О: Используй отладочные инструменты, логи и системы мониторинга асинхронных операций.

Лучшие практики

  • Всегда добавляй .catch() к промисам
  • Используй try-catch с async/await
  • Настраивай глобальные обработчики ошибок
  • Используй Promise.allSettled для множественных промисов
  • Мониторь необработанные отклонения