Node.jsのEADDRINUSE対処法
冒頭まとめ Node.jsのサーバーを起動したとき、次のエラーが出ることがあります。 Error: listen EADDRINUSE: address already in use :::3000 これは、指定した待ち受け先が既に使われていて、サーバーを起動できなかったことを表します。Node.jsの公式文書も、別のサーバーが同じ待ち受け先を使用している場合のエラーとして説明しています。 まず、そのポートを使うプログラムを確認します。不要な開発サーバーなら停止し、必要なものなら今回起動するサーバーのポートを変えます。パッケージの入れ直しを始める前に、待ち受け先を確認してください。 :::3000はアドレスとポートをつないだ表示 :::3000 は、IPv6のアドレス :: と、区切りの :、ポート番号 3000 をつないだ表示です。コロンの書き間違いではありません。 公式のlistenの説明では、ホストを省略すると、IPv6が利用可能なら ::、そうでなければIPv4の 0.0.0.0 で待ち受けます。どちらも、特定の1つのアドレスだけに限定しない指定です。 :: での待ち受けがIPv4側も受け付ける環境もあります。エラーがIPv6の表示だからといって、IPv4の待ち受けを確認対象から外さないでください。 また、同じNode.jsのプログラム内で別々のサーバーを作り、同じ待ち受け先を使った場合も重なります。必ずしも別のアプリが原因とは限りません。 Windowsではローカルの待ち受けとPIDを見る コマンドプロンプトで、現在の接続と待ち受けを表示します。 netstat -a -n -o Microsoftのnetstatの説明によると、-a は待ち受けを含めて表示し、-n はアドレスとポートを数値で表示し、-o はPIDを表示します。PIDは、実行中のプログラムを識別する番号です。 3000番でエラーが出たなら、TCPの行のローカルアドレスが :3000 で終わり、状態が LISTENING になっている行を探します。外部アドレス側に3000番がある行とは区別してください。 PIDが分かったら、プログラム名を確認します。次の12345は例なので、確認したPIDに置き換えます。 tasklist /fi "PID eq 12345" tasklistの公式説明には、PIDによる絞り込みが用意されています。ただし、名前が node.exe と分かっても、どのプロジェクトかまでは特定できません。起動したターミナルや、タスクマネージャーの詳細も照合してから停止します。 Linuxでは対象ポートを指定して確認する Linuxでは、次のコマンドで待ち受け中のTCPの3000番を確認できます。 ss -ltnp 'sport = :3000' ssの説明書きでは、-l は待ち受け、-t はTCP、-n は数値表示、-p は使用するプロセスの表示です。sport の条件でローカル側のポートを絞ります。 プロセス情報を確認できない場合は、必要な権限で実行してください。表示されたPIDやプログラム名を、停止する対象の確認に使います。 まずは起動したターミナルに戻り、Ctrl+Cで終了させます。自動で起動し直す仕組みを使っている場合は、その管理元で停止してください。子のプロセスだけを止めても、再起動される可能性があります。 既存サーバーを止めるかポートを変える 前に起動した開発サーバーが不要なら、停止した後でもう一度ポートを確認し、今回のサーバーを起動します。 Windowsで起動元から止められない場合は、対象を確認したうえでPIDを指定します。 taskkill /pid 12345 taskkillの説明では、/f は強制終了です。通常の停止で終わらず、強制終了してよい対象だと確認できた場合に限り追加します。 ...