1.概要
node.jsのパッケージ【mysql】を使って
MySQL8.0に接続しようとすると下記のエラーが発生しました。
内容は
という内容です。
このエラーの原因について調べてみました。
2.エラーの原因
原因はMySQL8.0から採用された認証プラグインが原因のようです。
MySQL5.7までは【mysql_native_password】だったのですが
MySQL8.0からは【caching_sha2_password】が採用されています。
名前のとおりSHA-256を使ったパスワードの暗号化です。
MySQLで確認してみると
mysql> SELECT user, host, plugin FROM mysql.user; +------------------+-----------+-----------------------+ | user | host | plugin | +------------------+-----------+-----------------------+ | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | | root | localhost | caching_sha2_password | | testuser | localhost | caching_sha2_password | +------------------+-----------+-----------------------+ 5 rows in set (0.00 sec)
のように認証プラグインが【caching_sha2_password】になっています。
node.jsのパッケージである【mysql】はこれに対応していない為エラーが発生したようです。
ちなみに【mysql】のバージョンは【2.18.1】の最新版でしたがうまくいきませんでした。
3.解決方法
①認証プラグインの変更
【caching_sha2_password】を【mysql_native_password】に変えてしまえという発想です。
方法としては下記のコマンドを実行すればいいようです。
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
ただこの方法で解決するのは嫌だったので、他の解決方法を探してみました。
②【mysql2】を使う
なんとmysql2というのがあるみたいです。
これは何なのかというと、以下に記載がありました。
github.com
要約すると
互換性もあるしこれからも機能追加を行っていく
どうやら今後を見越して【mysql2】を使った方がよさそうです。
ということでパッケージを追加して
>npm install mysql2
動作確認を行うと、【caching_sha2_password】の状態でも
無事に接続できることが確認出来ました。
バージョンは【2.1.0】になります。