🔖

npmパッケージのインストール時エラー対応 "npm ERR! code ECONNREFUSED"

2023/06/22に公開

はじめに

  • yarnパッケージのインストール時にエラーとなった為、対処法をメモする。
  • npmコマンドでインストールする際は、IPv6のアドレスに対して接続しようとしているっぽい。
  • なので、Windows OSでIPv6よりもIPv4を優先することで恒久対応となる。以下、確認プロセスをメモする。
エラーメッセージ

npm ERR! code ECONNREFUSED
npm ERR! syscall connect
npm ERR! errno ECONNREFUSED

PS C:\Users\hiroharu.tanaka\Desktop\vsCode\react18> node -v
v18.16.1
PS C:\Users\hiroharu.tanaka\Desktop\vsCode\react18> npm -v
9.5.1
PS C:\Users\hiroharu.tanaka\Desktop\vsCode\react18> npm install -g yarn
npm ERR! code ECONNREFUSED
npm ERR! syscall connect
npm ERR! errno ECONNREFUSED
npm ERR! FetchError: request to https://registry.npmjs.org/yarn failed, reason: connect ECONNREFUSED 2606:4700::6810:1a23:443
npm ERR!     at ClientRequest.<anonymous> (C:\Program Files\nodejs\node_modules\npm\node_modules\minipass-fetch\lib\index.js:130:14)        
npm ERR!     at ClientRequest.emit (node:events:513:28)
npm ERR!     at TLSSocket.socketErrorListener (node:_http_client:502:9)
npm ERR!     at TLSSocket.emit (node:events:525:35)
npm ERR!     at emitErrorNT (node:internal/streams/destroy:151:8)
npm ERR!     at emitErrorCloseNT (node:internal/streams/destroy:116:3)
npm ERR!     at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
npm ERR!  FetchError: request to https://registry.npmjs.org/yarn failed, reason: connect ECONNREFUSED 2606:4700::6810:1a23:443
npm ERR!     at ClientRequest.<anonymous> (C:\Program Files\nodejs\node_modules\npm\node_modules\minipass-fetch\lib\index.js:130:14)        
npm ERR!     at ClientRequest.emit (node:events:513:28)
npm ERR!     at TLSSocket.socketErrorListener (node:_http_client:502:9)
npm ERR!     at TLSSocket.emit (node:events:525:35)
npm ERR!     at emitErrorNT (node:internal/streams/destroy:151:8)
npm ERR!     at emitErrorCloseNT (node:internal/streams/destroy:116:3)
npm ERR!     at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
npm ERR!   code: 'ECONNREFUSED',
npm ERR!   errno: 'ECONNREFUSED',
npm ERR!   syscall: 'connect',
npm ERR!   address: '2606:4700::6810:1a23',
npm ERR!   port: 443,
npm ERR!   type: 'system',
npm ERR!   requiredBy: '.'
npm ERR! }
npm ERR!
npm ERR! If you are behind a proxy, please make sure that the
npm ERR! 'proxy' config is set properly.  See: 'npm help config'

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\hiroharu.tanaka\AppData\Local\npm-cache\_logs\2023-06-21T11_20_54_260Z-debug-0.log

curlでの接続確認

  • curl経由で接続してもエラーにはならない。
PS C:\Users\hiroharu.tanaka\Desktop\vsCode\react18> curl https://registry.npmjs.org/yarn   


StatusCode        : 200
StatusDescription : OK
Content           : {"_id":"yarn","_rev":"323-6be00da4deef316fca2193d354f35fea","name":"yarn","description":"ð¦ð Fast, reliable, and s      
                    ecure dependency management.","dist-tags":{"latest":"1.22.19","rc":"1.22.0","berr...
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    CF-Ray: 7dabee85ecd38a5c-NRT
                    CF-Cache-Status: REVALIDATED
                    Access-Control-Allow-Origin: *
                    Vary: accept-encoding, accept
                    x-amz-replication-status: FAILED
                    x-...
Forms             : {}
Headers           : {[Connection, keep-alive], [CF-Ray, 7dabee85ecd38a5c-NRT], [CF-Cache-Status, REVALIDATED], [Access-Control-Allow-Origin 
                    , *]...}
Images            : {@{innerHTML=; innerText=; outerHTML=<IMG alt='\"Yarn\"' src='\"https://github.com/yarnpkg/assets/blob/master/yarn-kitt
                    en-full.png?raw=true\"'>; outerText=; tagName=IMG; alt=\"Yarn\"; src=\"https://github.com/yarnpkg/assets/blob/master/ya 
                    rn-kitten-full.png?raw=true\"}, @{innerHTML=; innerText=; outerHTML=<IMG alt='\"Yarn\"' src='\"https://github.com/yarnp 
                    kg/assets/blob/master/yarn-kitten-full.png?raw=true\"'>; outerText=; tagName=IMG; alt=\"Yarn\"; src=\"https://github.co 
                    m/yarnpkg/assets/blob/master/yarn-kitten-full.png?raw=true\"}, @{innerHTML=; innerText=; outerHTML=<IMG alt='\"Yarn\"'  
                    src='\"https://github.com/yarnpkg/assets/blob/master/yarn-kitten-full.png?raw=true\"'>; outerText=; tagName=IMG; alt=\" 
                    Yarn\"; src=\"https://github.com/yarnpkg/assets/blob/master/yarn-kitten-full.png?raw=true\"}, @{innerHTML=; innerText=; 
                     outerHTML=<IMG alt='\"Yarn\"' src='\"https://github.com/yarnpkg/assets/blob/master/yarn-kitten-full.png?raw=true\"'>;  
                    outerText=; tagName=IMG; alt=\"Yarn\"; src=\"https://github.com/yarnpkg/assets/blob/master/yarn-kitten-full.png?raw=tru 
                    e\"}...}
InputFields       : {}
Links             : {@{innerHTML=<IMG alt='\"Yarn\"' src='\"https://github.com/yarnpkg/assets/blob/master/yarn-kitten-full.png?raw=true\"'>
                     ; innerText= ; outerHTML=<A href='\"https://yarnpkg.com/\"'><IMG alt='\"Yarn\"' src='\"https://github.com/yarnpkg/asse 
                    ts/blob/master/yarn-kitten-full.png?raw=true\"'> </A>; outerText= ; tagName=A; href=\"https://yarnpkg.com/\"}, @{innerH 
                    TML=<IMG alt='\"Yarn\"' src='\"https://github.com/yarnpkg/assets/blob/master/yarn-kitten-full.png?raw=true\"'> ; innerT 
                    ext= ; outerHTML=<A href='\"https://yarnpkg.com/\"'><IMG alt='\"Yarn\"' src='\"https://github.com/yarnpkg/assets/blob/m 
                    aster/yarn-kitten-full.png?raw=true\"'> </A>; outerText= ; tagName=A; href=\"https://yarnpkg.com/\"}, @{innerHTML=<IMG  
                    alt='\"Yarn\"' src='\"https://github.com/yarnpkg/assets/blob/master/yarn-kitten-full.png?raw=true\"'> ; innerText= ; ou 
                    terHTML=<A href='\"https://yarnpkg.com/\"'><IMG alt='\"Yarn\"' src='\"https://github.com/yarnpkg/assets/blob/master/yar 
                    n-kitten-full.png?raw=true\"'> </A>; outerText= ; tagName=A; href=\"https://yarnpkg.com/\"}, @{innerHTML=<IMG alt='\"Ya 
                    rn\"' src='\"https://github.com/yarnpkg/assets/blob/master/yarn-kitten-full.png?raw=true\"'> ; innerText= ; outerHTML=< 
                    A href='\"https://yarnpkg.com/\"'><IMG alt='\"Yarn\"' src='\"https://github.com/yarnpkg/assets/blob/master/yarn-kitten- 
                    full.png?raw=true\"'> </A>; outerText= ; tagName=A; href=\"https://yarnpkg.com/\"}...}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 423640
  • 以下メッセージより、どうもIPv6経由でアクセスしようとしているみたい。
  • 名前解決の際にIPv4を優先させれば、解決しそう。
npm ERR!   code: 'ECONNREFUSED',
npm ERR!   errno: 'ECONNREFUSED',
npm ERR!   syscall: 'connect',
npm ERR!   address: '2606:4700::6810:1a23',
npm ERR!   port: 443,
npm ERR!   type: 'system',
npm ERR!   requiredBy: '.'
  • nslookupを実行すると、IPv6アドレス群の中に「2606:4700::6810:1a23」を確認。
  • IPv4経由でアクセスできるようにしてみる。
  • curlコマンドの場合は、結果的にIPv4が選択され、npmの場合はIPv6がデフォルト選択されているのではないか。
PS C:\Users\hiroharu.tanaka\Desktop\vsCode\react18> nslookup registry.npmjs.org
サーバー:  UnKnown
Address:  2408:50:46ab:0:21f:67ff:fe06:12bc

権限のない回答:
名前:    registry.npmjs.org
Addresses:  2606:4700::6810:1023
          2606:4700::6810:1a23
          2606:4700::6810:1423
          2606:4700::6810:1523
          2606:4700::6810:1623
          2606:4700::6810:1323
          2606:4700::6810:1123
          2606:4700::6810:1923
          2606:4700::6810:1823
          2606:4700::6810:1b23
          2606:4700::6810:1223
          2606:4700::6810:1723
          104.16.27.35
          104.16.26.35
          104.16.23.35
          104.16.17.35
          104.16.22.35
          104.16.19.35
          104.16.25.35
          104.16.24.35
          104.16.16.35
          104.16.18.35
          104.16.20.35
          104.16.21.35

暫定対処

  • 今回は、IPv4アドレス群の中から一つ選択し、/etc/hostsに追記してみる。

  • 管理者権限での/etc/hostsの書き込みは以下記事を参照した。

  • PowerShellで以下コマンド入力
> powershell -NoProfile -ExecutionPolicy unrestricted -Command "start notepad C:\Windows\System32\drivers\etc\hosts -verb runas"
  • 名前解決の際には、以下IPv4が選択されるように/etc/hostsに追記する。

104.16.27.35 registry.npmjs.org

  • 無事インストール完了
PS C:\Users\hiroharu.tanaka\Desktop\vsCode\react18> npm install -g yarn
added 1 package in 750ms

恒久対応

  • そもそもWindows OSがIPv4よりIPv6優先としているため、優先順位を変更すればよい。
  • Windows PowerShellを「管理者として実行」する。
PS C:\Users\hiroharu.tanaka> netsh interface ipv6 show prefixpolicies
アクティブ状態を照会しています...

優先順位   ラベル  プレフィックス
----------  -----  --------------------------------
        50      0  ::1/128
        40      1  ::/0
        35      4  ::ffff:0:0/96
        30      2  2002::/16
         5      5  2001::/32
         3     13  fc00::/7
         1     11  fec0::/10
         1     12  3ffe::/16
         1      3  ::/96
  • ::ffff:0:0/96 がIPv4-mapped IPv6 address となる。この優先順位を上げてやればよい。
PS C:\WINDOWS\system32> netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 55 4
OK
  • 優先順位の第1に来ていることを確認する。これで、エラーメッセージの事象は発生しないことを確認できた。
PS C:\WINDOWS\system32> netsh interface ipv6 show prefixpolicies
アクティブ状態を照会しています...

優先順位   ラベル  プレフィックス
----------  -----  --------------------------------
        55      4  ::ffff:0:0/96
        50      0  ::1/128
        40      1  ::/0
        30      2  2002::/16
         5      5  2001::/32
         3     13  fc00::/7
         1     11  fec0::/10
         1     12  3ffe::/16
         1      3  ::/96

その他

Discussion