Что такое UnhandledPromiseRejectionWarning?
Ошибка UnhandledPromiseRejectionWarning
возникает в Node.js, когда промис отклоняется (rejected), но ошибка не обрабатывается с помощью .catch() или try-catch.
Причины возникновения
- Отсутствие обработки ошибок в промисах
- Забытые .catch() блоки
- Неправильное использование async/await
- Ошибки в асинхронных операциях
Как отладить ошибку
- Проверь обработку ошибок в промисах - добавь .catch() блоки
- Проверь async/await функции - используй try-catch
- Добавь глобальный обработчик - для отлова необработанных ошибок
- Проверь асинхронные операции - убедись в правильной обработке
Как исправить ошибку
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 для множественных промисов
- Мониторь необработанные отклонения