Что такое ошибка EADDRINUSE port already in use?
Ошибка Error: EADDRINUSE port already in use
возникает в Node.js, когда приложение пытается использовать порт, который уже занят другим процессом.
Причины возникновения
- Порт уже используется другим приложением
- Предыдущий процесс не был корректно завершен
- Конфликт портов в контейнерах Docker
- Неправильная конфигурация портов
Как отладить ошибку
- Проверь занятые порты - используй netstat или lsof
- Найди процесс, использующий порт - определи PID процесса
- Проверь конфигурацию приложения - убедись в правильности порта
- Проверь Docker контейнеры - если используешь контейнеризацию
Как исправить ошибку
1. Найди и заверши процесс, использующий порт
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 для корректного завершения
- Проверяй доступность портов перед запуском
- Мониторь использование портов в системе