MeWrite Docs

Error: listen EADDRINUSE: address already in use

Node.jsで指定したポートが既に使用されている場合のエラー

概要

Node.jsでHTTPサーバーやWebSocketサーバーを起動する際、指定したポート番号が既に他のプロセスで使用されている場合に発生するエラーです。

エラーメッセージ

Error: listen EADDRINUSE: address already in use :::3000
Error: listen EADDRINUSE: address already in use 127.0.0.1:8080

原因

  1. プロセスの二重起動: 同じアプリケーションを複数回起動している
  2. 前回のプロセスが残存: 正常終了せずプロセスが残っている
  3. 他のアプリケーション: 別のアプリケーションが同じポートを使用
  4. 開発ツール: Vite、Webpack Dev Serverなどが同じポートを使用

解決策

1. 使用中のプロセスを確認して終了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# macOS/Linux: ポートを使用しているプロセスを確認
lsof -i :3000

# プロセスを終了
kill -9 <PID>

# Windows: ポートを使用しているプロセスを確認
netstat -ano | findstr :3000

# プロセスを終了
taskkill /PID <PID> /F

2. 別のポートを使用

1
2
3
4
5
6
// 環境変数でポートを指定
const PORT = process.env.PORT || 3001;

app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

3. 空いているポートを自動検出

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import { createServer } from 'net';

function getAvailablePort(startPort) {
  return new Promise((resolve, reject) => {
    const server = createServer();
    server.listen(startPort, () => {
      const port = server.address().port;
      server.close(() => resolve(port));
    });
    server.on('error', () => {
      resolve(getAvailablePort(startPort + 1));
    });
  });
}

// 使用例
const port = await getAvailablePort(3000);
app.listen(port);

4. エラーハンドリングを追加

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
const server = app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

server.on('error', (error) => {
  if (error.code === 'EADDRINUSE') {
    console.error(`Port ${PORT} is already in use`);
    // 別のポートで再試行
    server.listen(PORT + 1);
  } else {
    throw error;
  }
});

5. プロセス終了時のクリーンアップ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
const server = app.listen(PORT);

// Graceful shutdown
process.on('SIGTERM', () => {
  server.close(() => {
    console.log('Server closed');
    process.exit(0);
  });
});

process.on('SIGINT', () => {
  server.close(() => {
    console.log('Server closed');
    process.exit(0);
  });
});

6. npmスクリプトでプロセスを終了

1
2
3
4
5
6
7
8
9
{
  "scripts": {
    "dev": "node server.js",
    "dev:clean": "kill-port 3000 && node server.js"
  },
  "devDependencies": {
    "kill-port": "^2.0.1"
  }
}

7. Dockerでの対処

1
2
3
4
5
# docker-compose.yml
services:
  app:
    ports:
      - "${PORT:-3000}:3000"  # 環境変数でポートを指定可能に

よくある間違い

  • 開発サーバーを複数のターミナルで起動してしまう
  • Ctrl+Cでプロセスを終了せずにターミナルを閉じる
  • Docker内外で同じポートを使用しようとする

関連エラー

参考リンク

Node.js の他のエラー

最終更新: 2025-12-13