Решение ошибки 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);

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

Пошаговый план для смены профессии

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

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

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.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Что означает ошибка EADDRINUSE в Node.js?
1 / 5