Решение ошибки EADDRINUSE в NodeJS и работа с портами
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для устранения ошибки EADDRINUSE:
- Освободите порт, завершив процесс, который его занимает:
lsof -i :PORT && kill -9 $(lsof -t -i :PORT)
- Используйте модуль
portfinder
для автовыбора свободного порта в Node.js:
const portfinder = require('portfinder');
portfinder.getPort((err, port) => {
// Запускаем сервер на новом порту `port`
});
- Или задайте другой порт в вашем приложении Node.js:
const PORT = 3001; // Возможно, с этим портом повезёт больше
app.listen(PORT);
Выберите вариант, который быстрее всего позволит решить проблему, освободив порт или поменяв его.
Проверка на конфликт процессов
Для проверки используйте следующую команду, чтобы выяснить, какие процессы используют конкретный порт:
sudo lsof -i tcp:PORT
Если вы обнаружили занятый порт, остановите процесс:
kill -15 PID
Сигнал SIGTERM позволит корректно завершить процесс и освободить порт.
Управление портами в коде
В коде Node.js следите за событием 'listening'
, подтверждающим запуск сервера:
server.on('listening', () => {
console.log(`Сервер работает на порту ${PORT}`); // Информация о запуске сервера
});
Для обработки ошибок EADDRINUSE используйте server.on('error')
:
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.
Если другие методы не помогают, используйте команду:
sudo fuser -k PORT/tcp
для принудительного освобождения порта.
Визуализация
Представьте ситуацию с занятыми местами на парковке:
🚗💥🅿️: [МАШИНА А, ВАША МАШИНА, МАШИНА В]
Ошибка: listen EADDRINUSE говорит о том, что ваше место уже занято.
Пройдите тест, узнайте какой профессии подходите
Освободите место для сервера:
🚗👋🅿️: [МАШИНА А, ПУСТОЕ МЕСТО, МАШИНА В]
Чтобы устранить проблему, остановите процесс или выберите другое место (порт).
Пройдите тест, узнайте какой профессии подходите
Определение правильных процессов
Профильтруйте фоновые процессы с ps ax
и grep
для node
:
ps ax | grep node
Убедитесь, что вы не останавливаете важный системный процесс.
Продвинутые стратегии и соображения
Помните, что браузеры и NodeJS работают с портами по-разному. Проверьте работу приложения в разных условиях для надёжности.
Используйте
'net.createServer'
для отслеживания сетевой активности и ручного контроля ошибок EADDRINUSE.
Полезные материалы
- Net | Документация Node.js v21.6.1 — о модуле 'net' и привязке адресов.
- Node.js — Цикл событий Node.js, таймеры и process.nextTick() — о цикле событий и асинхронных операциях.
- nodemon — о 'nodemon', который автоматически перезапускает серверы Node.js.
- portfinder – npm — для автоматического выбора открытых портов.
- Process | Документация Node.js v21.6.1 — о процессах и их корректном завершении.
- Node.js — Начало работы с отладкой – как начать отладку приложений на Node.js.