【Windows10】Node.jsを14⇒18にバージョンアップした後に躓いたこと

2023.05.19

私が参画したプロジェクトで、先日Nodeのバージョンアップを行いました。

バージョンアップ後にコマンドが動かなくなったり、Docker環境に接続できなくなったりと少しトラブルがありました。そこで、次に同じことが起きたときに参考になるように、どのように解決したかを残しておきます。

前提事項

私の環境です。

  • OS:Windows10
  • Node.js:v14.17.4からv18.16.0にバージョンアップ
  • バージョン管理ツール:fnm 1.31.1
  • パッケージマネージャー:yarn
  • ターミナル:Git Bash

バージョンアップ前のfnm listの結果は次の通りでした。

$ fnm list
* v14.17.4 default
* v16.13.1
* v17.0.0
* system

v18.16.0のインストール

私のプロジェクトでは、.node-versionでバージョンを管理しているため、.node-versionがあるフォルダに移動すると以下のようにダイアログが表示されます。

Can't find an installed Node version matching v18.16.0.
Do you want to install it? answer [y/n]:

yを入力すると自動的にインストールされます。fnm listで見てみるとちゃんとインストールされたことがわかります。

$ fnm list
* v14.17.4 default
* v16.13.1
* v17.0.0
* v18.16.0
* system

以下コマンドでデフォルトをv18.16.0にしました。

fnm default v18.16.0

yarnの再インストール

yarnコマンドを実行してみると、No such file or directoryエラーが出ました。

$ yarn -v
bash: /c/Users/kato.yuka/AppData/Local/fnm_multishells/17700_1684279343141/yarn: No such file or directory

エラーメッセージに表示されているフォルダを見ると、確かにyarnがありません。

一旦、v14.17.4に戻してみます。

$ fnm use v14.17.4
Using Node v14.17.4

改めてフォルダを見るとyarnがありました。

再度v18.16.0に戻して、yarnをインストールしました。

$ fnm use v18.16.0
Using Node v18.16.0
$ npm install -g yarn

added 1 package in 239ms

これで元通りyarnが使えるようになりました。

$ yarn -v
1.22.19

--dns-result-orderの設定

その後、ローカルのコンテナで起動しているPostgreSQLに接続しようとすると、以下のエラーが出てしまいました。

Error: connect ETIMEDOUT ::1:5432
    at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1494:16) {
  errno: -4039,
  code: 'ETIMEDOUT',
  syscall: 'connect',
  address: '::1',
  port: 5432
}

調べてみると、--dns-result-orderという、DNSで名前解決した結果のソート順を決めるオプションがv14.18.0から追加されており、さらにv17.0.0からそのデフォルトがverbatimという値になったことが原因のようでした。そこで、IPv4が先に来るようにNODE_OPTIONSの値を設定しました。

参考:

Command-line API | Node.js v20.2.0 Documentation

私の場合は.bashrcに既にメモリ容量を設定するためのオプションを追加していたので、その後ろに--dns-result-orderを追加しました。

export NODE_OPTIONS="--max_old_space_size=8192 --dns-result-order=ipv4first"

おわりに

開発環境は人によって大きく異なるので、私の環境ではこうだったという内容になりましたが、もしどなたかの参考になったら幸いです。