私が参画したプロジェクトで、先日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"
おわりに
開発環境は人によって大きく異なるので、私の環境ではこうだったという内容になりましたが、もしどなたかの参考になったら幸いです。