Что такое ошибка ENOTFOUND hostname?

Ошибка Error: ENOTFOUND hostname возникает в Node.js, когда приложение не может разрешить DNS имя хоста в IP адрес.

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

  • Неправильное написание имени хоста
  • Проблемы с DNS резолюцией
  • Сетевые проблемы подключения
  • Неправильные настройки прокси

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

  1. Проверь правильность имени хоста - убедись в отсутствии опечаток
  2. Проверь DNS резолюцию - используй nslookup или dig
  3. Проверь сетевое подключение - тестируй доступность сети
  4. Проверь настройки прокси - убедись в правильности конфигурации

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

1. Проверь правильность имени хоста

1// Неправильно
2const url = 'https://api.exampl.com/api'; // опечатка в example
3
4// Правильно
5const url = 'https://api.example.com/api';

2. Добавь обработку ошибок

 1const https = require('https');
 2
 3function makeRequest(hostname) {
 4    return new Promise((resolve, reject) => {
 5        const options = {
 6            hostname: hostname,
 7            port: 443,
 8            path: '/api',
 9            method: 'GET'
10        };
11
12        const req = https.request(options, (res) => {
13            let data = '';
14            res.on('data', (chunk) => {
15                data += chunk;
16            });
17            res.on('end', () => {
18                resolve(data);
19            });
20        });
21
22        req.on('error', (error) => {
23            if (error.code === 'ENOTFOUND') {
24                console.error(`Не удалось найти хост: ${hostname}`);
25            }
26            reject(error);
27        });
28
29        req.end();
30    });
31}

3. Используй retry логику

 1async function makeRequestWithRetry(hostname, maxRetries = 3) {
 2    for (let i = 0; i < maxRetries; i++) {
 3        try {
 4            const result = await makeRequest(hostname);
 5            return result;
 6        } catch (error) {
 7            if (error.code === 'ENOTFOUND') {
 8                console.log(`Попытка ${i + 1} из ${maxRetries} не удалась`);
 9                if (i === maxRetries - 1) {
10                    throw new Error(`Не удалось подключиться к ${hostname} после ${maxRetries} попыток`);
11                }
12                // ждем перед повторной попыткой
13                await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)));
14            } else {
15                throw error;
16            }
17        }
18    }
19}

4. Проверь DNS резолюцию

 1const dns = require('dns');
 2
 3function checkDNS(hostname) {
 4    return new Promise((resolve, reject) => {
 5        dns.lookup(hostname, (err, address, family) => {
 6            if (err) {
 7                console.error(`DNS резолюция не удалась для ${hostname}:`, err.message);
 8                reject(err);
 9            } else {
10                console.log(`Хост ${hostname} резолвится в ${address}`);
11                resolve(address);
12            }
13        });
14    });
15}

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

  • Настрой логирование ENOTFOUND ошибок
  • Мониторь доступность внешних сервисов
  • Настрой алерты на проблемы с DNS
  • Используй health checks для проверки подключений

FAQ

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

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

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

О: Следуй best practices и реализуй правильную обработку сетевых ошибок с retry логикой.

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

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

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

  • Всегда проверяй правильность имен хостов
  • Добавляй обработку сетевых ошибок
  • Используй retry логику для восстановления
  • Проверяй DNS резолюцию перед запросами
  • Мониторь доступность внешних сервисов