メインコンテンツまでスキップ

npm install で ECONNREFUSED となる(完結編)

過去にも悩まされていた(過去1過去2)、npm install しようとすると ECONNREFUSED のエラーになってしまうことについて原因と対処法がついに分かった。

原因

Node.js 17 から先では IPv6 接続を優先するようになり、その結果 IPv4-only のネットワークからはリクエストが通らなくなってしまったらしい。

私は ISP はエキサイト光を契約しているのだが、その接続方式が IPv4 PPPoE だった。

ホームゲートウェイなどのIPv6対応機器を使用して接続している場合、IPv6方式による自動接続が行われます。

とのことらしいが、私が持っている機器は IPv6 未対応のようだ。自身のインターネット環境が IPv6 に対応しているかどうかは test-ipv6.com というサイトで確認できる。

対処法

前項でもリンクした記事では .npmrc を書き換える方法(オプションの中身が間違っているような気がする)と npm に alias を与える方法を紹介しているが、個人的には下記の記事に書かれている、 NODE_OPTIONS の環境変数を設定する方法が一番わかりやすかった。

具体的には、.bashrc に一行追加すれば良い。

export NODE_OPTIONS=--dns-result-order=ipv4first

global にインストールしたい場合など、 sudo で行いたい場合は環境変数が引き継がれないので --preserve-env=NODE_OPTIONS を付け加える必要がある。例えば yarn を global にインストールしたい場合は下記のようになる。

sudo --preserve-env=NODE_OPTIONS npm install --global yarn