Node.jsを使用していると、特に開発環境で「EADDRINUSE」というエラーに遭遇することがあります。このエラーは、指定したポートがすでに他のプロセスによって使用されている場合に発生します。具体的には、以下のようなエラーメッセージが表示されます。
Error: listen EADDRINUSE: address already in use :::3000
このエラーは、開発中のアプリケーションが同じポートで再起動しようとしたときや、他のアプリケーションがそのポートを使用している場合に発生します。本記事では、この「EADDRINUSE」エラーを解決するための5つの方法を具体的なコード例とともに解説します。
1. 使用中のプロセスを特定して終了する
最初のステップは、どのプロセスがポートを占有しているかを特定し、そのプロセスを終了することです。以下の手順で行います。
手順
1. 使用中のプロセスを確認する
LinuxやMacの場合、以下のコマンドを使用します。
lsof -i :3000
Windowsの場合は、以下のコマンドを使用します。
netstat -ano | findstr :3000
2. プロセスを終了する
LinuxやMacの場合、プロセスID(PID)を取得したら、以下のコマンドで終了します。
kill -9 <PID>
Windowsの場合は、以下のコマンドを使用します。
taskkill /PID <PID> /F
例
# Linux/Mac
$ lsof -i :3000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 12345 user 22u IPv6 0xabcde12345 0t0 TCP *:3000 (LISTEN)
$ kill -9 12345
# Windows
C:\> netstat -ano | findstr :3000
TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 12345
C:\> taskkill /PID 12345 /F
2. ポート番号を変更する
もし特定のポートが他のアプリケーションによって使用されている場合、アプリケーションのポート番号を変更することも一つの解決策です。これにより、ポートの競合を回避できます。
手順
- アプリケーションの設定ファイルやコード内でポート番号を変更します。
- 変更後、アプリケーションを再起動します。
例
const express = require('express');
const app = express();
const PORT = process.env.PORT || 4000; // ポート番号を4000に変更
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
3. Nodemonを使用している場合の対策
Nodemonを使用していると、ファイルの変更を監視して自動的にサーバーを再起動しますが、時には古いプロセスが残ってしまうことがあります。この場合、Nodemonの設定を変更して、プロセスを強制終了することができます。
手順
kill-port
パッケージをインストールします。npm install --save-dev kill-port
nodemon.json
ファイルを作成し、以下の設定を追加します。{ "events": { "restart": "kill-port 3000", "crash": "kill-port 3000" }, "delay": "1500" }
- Nodemonを再起動します。
例
// nodemon.json
{
"events": {
"restart": "kill-port 3000",
"crash": "kill-port 3000"
},
"delay": "1500"
}
4. サーバーをグレースフルに終了する
アプリケーションが正常に終了しない場合、ポートが解放されないことがあります。サーバーをグレースフルに終了させることで、ポートを解放することができます。
手順
- サーバーの終了処理を追加します。
SIGINT
やSIGTERM
シグナルをリッスンして、サーバーを正常に終了させます。
例
const express = require('express');
const app = express();
const server = app.listen(3000, () => {
console.log('Server is running on port 3000');
});
// グレースフルシャットダウン
process.on('SIGINT', () => {
server.close(() => {
console.log('Server closed');
process.exit(0);
});
});
5. システムの再起動
最後の手段として、システムを再起動することも効果的です。特に、開発環境で複数のプロセスが残っている場合、再起動することで全てのプロセスが終了し、ポートが解放されます。
まとめ
Node.jsの「EADDRINUSE」エラーは、ポートの競合によって発生しますが、上記の方法を試すことで解決できます。使用中のプロセスを特定して終了する、ポート番号を変更する、Nodemonの設定を見直す、サーバーをグレースフルに終了する、そして最終手段としてシステムを再起動することが考えられます。これらの対策を講じることで、スムーズに開発を進めることができるでしょう。