#Что означает ошибка
EADDRINUSE
Ошибка EADDRINUSE при запуске Node.js-сервера означает, что нужный порт (чаще 3000 или 8080) уже занят другим процессом. Операционная система не позволяет двум приложениям слушать один и тот же порт на одном адресе. Чаще всего «виновник» — предыдущий запуск того же проекта, который не завершился.
Это типичная ситуация в разработке: терминал закрыли, а процесс остался в фоне; запустили второй экземпляр в другом окне; Docker-контейнер или другая программа используют тот же порт.
Остановите процесс, занявший порт, или смените порт.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Порт занятПроцесс. | Проявляется как «EADDRINUSE» или близкий по смыслу сбой. | Завершите. |
| Дубль запускаТерминал. | Проявляется как «EADDRINUSE» или близкий по смыслу сбой. | Остановите. |
| DockerПорт. | Проявляется как «EADDRINUSE» или близкий по смыслу сбой. | Освободите. |
| Фоновый сервисСтарый. | Проявляется как «EADDRINUSE» или близкий по смыслу сбой. | Убейте. |
#Пошаговое решение
- Найдите процесс, занявший портВ терминале Windows выполните
netstat -ano | findstr :3000; среди строк найдите состояниеLISTENINGи PID. В Linuxss -ltnp "sport = :3000", в macOSlsof -nP -iTCP:3000 -sTCP:LISTEN. Укажите собственный порт, если он другой. - Убедитесь, что процесс вашНа Windows в Диспетчере задач → «Подробности» сопоставьте PID с именем процесса; в Linux/macOS
ps -p PID -o pid,comm,argsпосле подстановки числа. Если это чужая служба, не завершайте её. Если это ваш dev-сервер, остановите его сочетанием Ctrl+C в исходном терминале либо через штатный менеджер процессов. - Либо назначьте свободный портВ конфигурации приложения читайте
process.env.PORTи выберите незанятое значение, например 3001; в PowerShell$env:PORT=3001; node app.js, в UnixPORT=3001 node app.js. Учитывайте, что адрес фронтенда и обратного прокси тоже может ссылаться на прежний порт. - Проверьте успешное прослушиваниеЗапустите приложение, откройте
http://localhost:3001(или порт из лога) и убедитесь в ответе. Если старый процесс возвращается после остановки, проверьтеpm2 list, службы systemd илиdocker psна фактический автозапуск; не выполняйтеpm2 delete allилиkill -9для всех процессов.
#Как найти процесс
На Linux и macOS выполните lsof -i :3000 или ss -ltnp | grep 3000, чтобы увидеть PID процесса. В Windows используйте netstat -ano | findstr :3000, а затем tasklist /FI "PID eq номер". Это покажет, какой программе принадлежит порт.
#Как освободить порт
Завершите процесс командой kill PID (или taskkill /PID номер /F в Windows). Если процесс принадлежит нужной службе, измените порт приложения через переменную окружения PORT. Используйте инструменты вроде nodemon или pm2, которые корректно управляют перезапусками, а не запускайте несколько копий вручную.
#Профилактика
Корректно обрабатывайте сигналы SIGINT и SIGTERM и закрывайте сервер методом server.close() перед выходом. В конфигурации проекта берите порт из окружения, а не прописывайте жёстко. Для портов ниже 1024 на Linux нужны особые права — используйте обратный прокси (nginx) вместо запуска Node.js от root.
ss -ltnp "sport = :3000"Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить, что порт свободен
После завершения процесса повторите команду поиска: она не должна выводить строк для нужного порта. Затем запустите приложение и откройте адрес в браузере. Если порт снова оказывается занятым после каждой перезагрузки, ищите службу автозапуска (systemd-юнит, pm2, Docker-контейнер с публикацией порта) — завершать процесс вручную бесполезно, пока не отключён его источник.