「Error: listen EADDRINUSE」エラーを解決して、Node.jsサーバーをスムーズに起動する方法
Node.jsで "Error: listen EADDRINUSE" エラーが発生した時の解決方法
Node.jsでサーバーを起動しようとすると、"Error: listen EADDRINUSE" というエラーが発生することがあります。これは、すでに別のプロセスが同じポートを使用しているために発生します。
原因
このエラーが発生する主な原因は、以下の2つです。
- 別のプロセスが同じポートを使用している
- 以前に起動したサーバーが完全に終了していない
解決方法
このエラーを解決するには、以下の方法を試してください。
使用ポートを確認する
まず、使用しようとしているポート番号が既に使用されていないことを確認する必要があります。以下のコマンドを使用して、使用中のポートを確認できます。
netstat -an | findstr /i "LISTEN"
このコマンドを実行すると、使用中のポート番号と、そのポートを使用しているプロセスのIDが表示されます。
使用中のポートが別のプロセスによって使用されている場合は、そのプロセスを終了するか、別のポートを使用するように設定する必要があります。
以前に起動したサーバーが完全に終了していない場合は、以下のコマンドを使用して強制終了できます。
taskkill /F /PID <PID>
<PID>
には、終了したいサーバーのプロセスIDを指定します。
コードを確認する
上記の方法で解決できない場合は、コードに問題がないかどうかを確認する必要があります。特に、以下の点を確認してください。
- ポート番号が正しく設定されているか
- サーバーが正しく終了しているか
- 複数のサーバーを同時に起動していないか
上記の方法で解決できない場合は、以下の情報を提供していただければ、さらに詳しく調査いたします。
- 使用しているNode.jsのバージョン
- 使用しているOS
- コード
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World!');
});
server.listen(8080, () => {
console.log('Server is listening on port 8080');
});
このコードを実行すると、以下のメッセージが表示されます。
Server is listening on port 8080
エラー発生例
以下のコードは、ポート8080で既にサーバーが起動している場合に、エラーが発生します。
const http = require('http');
const server1 = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World!');
});
server1.listen(8080, () => {
console.log('Server1 is listening on port 8080');
});
const server2 = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World!');
});
server2.listen(8080, () => {
console.log('Server2 is listening on port 8080');
});
Error: listen EADDRINUSE: address already in use :::8080
解決例
- ポート番号を変更する
- 別のポートを使用しているサーバーを終了する
- コードを変更して、複数のサーバーを同時に起動できるようにする
"Error: listen EADDRINUSE" エラーを解決する他の方法
net.createServer() の代わりに http.createServer() を使用する
Node.js では、net.createServer()
と http.createServer()
の2つの方法でサーバーを作成できます。net.createServer()
は生のTCPソケットを使用する一方、http.createServer()
は HTTP プロトコルを自動的に処理します。
net.createServer()
を使用している場合は、http.createServer()
に置き換えることで、エラーを解決できる可能性があります。
SO_REUSEADDR
オプションは、同じポート番号を複数のソケットで使用するように設定します。このオプションを使用すると、別のプロセスが既にポートを使用している場合でも、サーバーを起動できる可能性があります。
以下のコードは、SO_REUSEADDR
オプションを使用する例です。
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World!');
});
server.listen(8080, {
SO_REUSEADDR: true
});
forever
モジュールは、サーバーを自動的に再起動するモジュールです。このモジュールを使用すると、サーバーがクラッシュしても、自動的に再起動されるため、エラーを回避できます。
以下のコードは、forever
モジュールを使用する例です。
const forever = require('forever');
const server = forever.start('server.js');
server.on('start', () => {
console.log('Server is listening on port 8080');
});
server.on('error', (err) => {
console.log('Error: ', err);
});
クラウドサービスを使用する
Heroku や AWS Lambda などのクラウドサービスを使用すると、サーバーの管理を自分で行う必要はありません。これらのサービスは、自動的にスケーリングし、エラーを処理するため、"Error: listen EADDRINUSE" エラーが発生する可能性が低くなります。
javascript node.js