Решение ошибки EADDRINUSE в NodeJS и работа с портами

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для устранения ошибки EADDRINUSE:

  • Освободите порт, завершив процесс, который его занимает:
Bash
Скопировать код
lsof -i :PORT && kill -9 $(lsof -t -i :PORT)
  • Используйте модуль portfinder для автовыбора свободного порта в Node.js:
JS
Скопировать код
const portfinder = require('portfinder');

portfinder.getPort((err, port) => {
  // Запускаем сервер на новом порту `port`
});
  • Или задайте другой порт в вашем приложении Node.js:
JS
Скопировать код
const PORT = 3001;  // Возможно, с этим портом повезёт больше
app.listen(PORT);

Выберите вариант, который быстрее всего позволит решить проблему, освободив порт или поменяв его.

Кинга Идем в IT: пошаговый план для смены профессии

Проверка на конфликт процессов

Для проверки используйте следующую команду, чтобы выяснить, какие процессы используют конкретный порт:

Bash
Скопировать код
sudo lsof -i tcp:PORT

Если вы обнаружили занятый порт, остановите процесс:

Bash
Скопировать код
kill -15 PID

Сигнал SIGTERM позволит корректно завершить процесс и освободить порт.

Управление портами в коде

В коде Node.js следите за событием 'listening', подтверждающим запуск сервера:

JS
Скопировать код
server.on('listening', () => {
  console.log(`Сервер работает на порту ${PORT}`);  // Информация о запуске сервера
});

Для обработки ошибок EADDRINUSE используйте server.on('error'):

JS
Скопировать код
server.on('error', (error) => {
  if (error.code === 'EADDRINUSE') {
    console.error(`Порт ${PORT} занят. Ищем замену...`);
    server.listen(++PORT);  // Переключаемся на следующий порт
  } else {
    throw error;  // Выводим другие ошибки
  }
});

Если возникает ошибка EADDRINUSE, сервер попытается занять следующий свободный порт.

Разнообразные решения и рекомендации

  • Рассмотрите возможность использования Nginx в качестве обратного прокси для управления несколькими приложениями через порт 80.

  • Учтите системную защиту и ограничения, которые могут препятствовать использованию порта.

  • Для правильного завершения процессов Node используйте CTRL+C, так процесс завершится корректно.

  • Будьте внимательны к приложениям, которые могут захватить порты, например, Skype.

  • Используйте nodemon или PM2 для управления процессами, что позволит избежать необходимости вручную отслеживать PID.

  • Если другие методы не помогают, используйте команду:

Bash
Скопировать код
sudo fuser -k PORT/tcp

для принудительного освобождения порта.

Визуализация

Представьте ситуацию с занятыми местами на парковке:

🚗💥🅿️: [МАШИНА А, ВАША МАШИНА, МАШИНА В]

Ошибка: listen EADDRINUSE говорит о том, что ваше место уже занято.

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Освободите место для сервера:

🚗👋🅿️: [МАШИНА А, ПУСТОЕ МЕСТО, МАШИНА В]

Чтобы устранить проблему, остановите процесс или выберите другое место (порт).

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Определение правильных процессов

Профильтруйте фоновые процессы с ps ax и grep для node:

Bash
Скопировать код
ps ax | grep node

Убедитесь, что вы не останавливаете важный системный процесс.

Продвинутые стратегии и соображения

  • Помните, что браузеры и NodeJS работают с портами по-разному. Проверьте работу приложения в разных условиях для надёжности.

  • Используйте 'net.createServer' для отслеживания сетевой активности и ручного контроля ошибок EADDRINUSE.

Полезные материалы

  1. Net | Документация Node.js v21.6.1 — о модуле 'net' и привязке адресов.
  2. Node.js — Цикл событий Node.js, таймеры и process.nextTick() — о цикле событий и асинхронных операциях.
  3. nodemon — о 'nodemon', который автоматически перезапускает серверы Node.js.
  4. portfinder – npm — для автоматического выбора открытых портов.
  5. Process | Документация Node.js v21.6.1 — о процессах и их корректном завершении.
  6. Node.js — Начало работы с отладкой – как начать отладку приложений на Node.js.