Что такое ошибка EADDRINUSE port already in use?

Ошибка Error: EADDRINUSE port already in use возникает в Node.js, когда приложение пытается использовать порт, который уже занят другим процессом.

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

  • Порт уже используется другим приложением
  • Предыдущий процесс не был корректно завершен
  • Конфликт портов в контейнерах Docker
  • Неправильная конфигурация портов

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

  1. Проверь занятые порты - используй netstat или lsof
  2. Найди процесс, использующий порт - определи PID процесса
  3. Проверь конфигурацию приложения - убедись в правильности порта
  4. Проверь Docker контейнеры - если используешь контейнеризацию

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

1. Найди и заверши процесс, использующий порт

1# Найди процесс, использующий порт 3000
2lsof -i :3000
3
4# Или используй netstat
5netstat -tulpn | grep :3000
6
7# Заверши процесс по PID
8kill -9 <PID>

2. Используй переменную окружения для порта

 1const express = require('express');
 2const app = express();
 3
 4// Используй переменную окружения или порт по умолчанию
 5const PORT = process.env.PORT || 3000;
 6
 7app.listen(PORT, () => {
 8    console.log(`Сервер запущен на порту ${PORT}`);
 9}).on('error', (error) => {
10    if (error.code === 'EADDRINUSE') {
11        console.error(`Порт ${PORT} уже используется`);
12        process.exit(1);
13    } else {
14        console.error('Ошибка запуска сервера:', error);
15    }
16});

3. Добавь автоматический поиск свободного порта

 1const express = require('express');
 2const net = require('net');
 3
 4function findAvailablePort(startPort) {
 5    return new Promise((resolve, reject) => {
 6        const server = net.createServer();
 7        
 8        server.listen(startPort, () => {
 9            const { port } = server.address();
10            server.close(() => resolve(port));
11        });
12        
13        server.on('error', (error) => {
14            if (error.code === 'EADDRINUSE') {
15                resolve(findAvailablePort(startPort + 1));
16            } else {
17                reject(error);
18            }
19        });
20    });
21}
22
23async function startServer() {
24    try {
25        const port = await findAvailablePort(3000);
26        const app = express();
27        
28        app.listen(port, () => {
29            console.log(`Сервер запущен на порту ${port}`);
30        });
31    } catch (error) {
32        console.error('Ошибка запуска сервера:', error);
33    }
34}
35
36startServer();

4. Используй graceful shutdown

 1const express = require('express');
 2const app = express();
 3
 4const server = app.listen(3000, () => {
 5    console.log('Сервер запущен на порту 3000');
 6});
 7
 8// Graceful shutdown
 9process.on('SIGTERM', () => {
10    console.log('Получен SIGTERM, завершаем сервер...');
11    server.close(() => {
12        console.log('Сервер завершен');
13        process.exit(0);
14    });
15});
16
17process.on('SIGINT', () => {
18    console.log('Получен SIGINT, завершаем сервер...');
19    server.close(() => {
20        console.log('Сервер завершен');
21        process.exit(0);
22    });
23});

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

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

FAQ

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

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

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

О: Следуй best practices и используй переменные окружения для портов с fallback значениями.

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

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

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

  • Всегда используй переменные окружения для портов
  • Добавляй обработку ошибок при запуске сервера
  • Используй graceful shutdown для корректного завершения
  • Проверяй доступность портов перед запуском
  • Мониторь использование портов в системе