Node.js mysqlクライアントが認証プロトコルをサポートしていない問題を解決する

Node.js mysqlクライアントが認証プロトコルをサポートしていない問題を解決する

序文

mysql モジュール (プロジェクト アドレスは https://github.com/mysqljs/mysql) は、Node.js アプリケーションで MySQL を操作できる JavaScript で記述されたオープン ソースの MySQL ドライバーです。しかし、使用中に「ER_NOT_SUPPORTED_AUTH_MODE」問題が発生しました。

この記事では、この問題の原因と解決策について説明します。

エラーメッセージ

mysql モジュールを使用して MySQL 8 に接続しようとすると、次のエラー メッセージが表示されます。

D:\workspaceGithub\nodejs-book-sa​​mples\samples\mysql-demo\index.js:17
エラーをスローします。
^
エラー: ER_NOT_SUPPORTED_AUTH_MODE: クライアントはサーバーが要求した認証プロトコルをサポートしていません。MySQL クライアントのアップグレードを検討してください。
Handshake.Sequence._packetToError (D:\workspaceGithub\nodejs-book-sa​​mples\samples\mysql-demo\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14) で
Handshake.ErrorPacket (D:\workspaceGithub\nodejs-book-sa​​mples\samples\mysql-demo\node_modules\mysql\lib\protocol\sequences\Handshake.js:123:18) で
Protocol._parsePacket (D:\workspaceGithub\nodejs-book-sa​​mples\samples\mysql-demo\node_modules\mysql\lib\protocol\Protocol.js:291:23) で
Parser._parsePacket (D:\workspaceGithub\nodejs-book-sa​​mples\samples\mysql-demo\node_modules\mysql\lib\protocol\Parser.js:433:10) で
Parser.write (D:\workspaceGithub\nodejs-book-sa​​mples\samples\mysql-demo\node_modules\mysql\lib\protocol\Parser.js:43:10) で
Protocol.write (D:\workspaceGithub\nodejs-book-sa​​mples\samples\mysql-demo\node_modules\mysql\lib\protocol\Protocol.js:38:16) で
Socket.<anonymous> (D:\workspaceGithub\nodejs-book-sa​​mples\samples\mysql-demo\node_modules\mysql\lib\Connection.js:91:28) で
Socket.<anonymous> (D:\workspaceGithub\nodejs-book-sa​​mples\samples\mysql-demo\node_modules\mysql\lib\Connection.js:525:10) で
Socket.emit (events.js:196:13) で
addChunk で (_stream_readable.js:290:12)
--------------------
Protocol._enqueue (D:\workspaceGithub\nodejs-book-sa​​mples\samples\mysql-demo\node_modules\mysql\lib\protocol\Protocol.js:144:48) で
Protocol.handshake (D:\workspaceGithub\nodejs-book-sa​​mples\samples\mysql-demo\node_modules\mysql\lib\protocol\Protocol.js:51:23) で
Connection.connect (D:\workspaceGithub\nodejs-book-sa​​mples\samples\mysql-demo\node_modules\mysql\lib\Connection.js:119:18) で
オブジェクト.<匿名> (D:\workspaceGithub\nodejs-book-sa​​mples\samples\mysql-demo\index.js:12:12)
Module._compile (internal/modules/cjs/loader.js:759:30) で
Object.Module._extensions..js (internal/modules/cjs/loader.js:770:10) で
Module.load (internal/modules/cjs/loader.js:628:32) で
Function.Module._load (internal/modules/cjs/loader.js:555:12) で
Function.Module.runMain (internal/modules/cjs/loader.js:826:10) で
internal/main/run_main_module.js:17:11 で

エラーの原因

このエラーが発生する理由は、現在、最新の MySQL モジュールが MySQL 8 の「caching_sha2_password」暗号化方式を完全にサポートしておらず、「caching_sha2_password」が MySQL 8 のデフォルトの暗号化方式であるためです。そのため、以下のコマンドではデフォルトで「caching_sha2_password」暗号化方式が使用され、アカウントとパスワードはmysqlモジュールで使用できなくなります。

mysql> ALTER USER 'root'@'localhost' が '123456' によって識別されます。
クエリは正常、影響を受けた行は 0 行 (0.12 秒)

回避策

解決策は、ユーザー root のパスワードを変更し、mysql モジュールがサポートできる暗号化方法を指定することです。

mysql> ALTER USER 'root'@'localhost' が mysql_native_password によって '123456' で識別されます。
クエリは正常、影響を受けた行は 0 行 (0.12 秒)

上記の文は、「mysql_native_password」を使用した暗号化方式が指定されていることを示しています。このメソッドは、mysql モジュールによってサポートされています。

アプリケーションを再度実行すると、次のコンソール出力が表示されます。

$ ノードindex.js
結果は次のとおりです: RowDataPacket { user_id: 1, username: '老卫' }

このうち、「RowDataPacket { user_id: 1, username: '老卫' }」はデータベースクエリの結果です。

ソースコード

このセクションの例は、https://github.com/waylau/nodejs-book-sa​​mples の「mysql-demo」アプリケーションにあります。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL mysqladmin クライアントの使用の概要
  • MySQL は対応するクライアント プロセスにどのように接続しますか?
  • MySql クライアントが数秒で終了する問題を解決する (my.ini が見つからない)
  • PHP Swoole 非同期 MySQL クライアント実装例
  • mysql8.0.11クライアントがログインできない問題の解決方法
  • 絵文字と問題解決のためのMySQL/Javaサーバーサポートの詳細な説明
  • NodeJS サーバー開発入門 (Express+MySQL)
  • アプリケーション サーバー用の MySQL 接続プール (高い同時実行性をサポート)
  • MySQLクライアントとサーバーのプロトコルの解釈

<<:  WeChatアプレットはシンプルな手書き署名コンポーネントを実装します

>>:  nginx ベースのブラウザネゴシエーションキャッシュプロセスの詳細な説明

推薦する

MySQL コマンドライン操作中のエンコードの問題の詳細な説明

1. MySQLデータベースのエンコーディングを確認する mysql -u ユーザー名 -p パスワ...

ウェブサイトのパフォーマンスを向上させるために画像を最適化する方法

目次概要画像圧縮とはJPEG/JPG JPGの利点JPGの使用シナリオJPGの欠点MozJPEG を...

Alibaba Cloud centos7にmysql8.0.22をインストールする詳細なチュートリアル

1. MySQLインストールパッケージをダウンロードするまず、https://dev.mysql.c...

異なるブラウザ間で互換性のあるテキスト配置を実現する CSS

フォームのフロントエンド レイアウトでは、テキスト ボックスのプロンプト テキストを両端に揃える必要...

JavaScript スクリプトが実行されるタイミングの詳細な説明

JavaScript スクリプトは HTML 内のどこにでも埋め込むことができますが、いつ呼び出され...

Dockerでイメージ情報を表示する方法

この記事では、Dockerでイメージ情報を表示する方法を学ぶ必要があります。 1. imagesコマ...

Ubuntu で中国語入力方法が使えない場合の解決策

Ubuntu では中国語入力方法の解決策はありません。仮想マシンや Ubuntu システムをインスト...

Vueシングルページアプリケーションの事前レンダリング方法の例

目次序文vue-cli 2.0 バージョンvue-cli 3.0 バージョン要約する序文vue-cl...

シェルスクリプトはNginxのaccess.logのPVを定期的にカウントし、APIに送信してデータベースに保存します。

1. PVとIPの統計一日のPV(ページビュー)をカウントする cat access.log | ...

ApacheBench でマルチ URL をサポートする方法

標準の ab は単一の URI でのストレス テストのみをサポートしており、実際のニーズを満たしてい...

MySQL パラメータ関連の概念とクエリ変更方法

序文:以前の記事では、特定のパラメータの機能についてよく紹介してきました。しかし、MySQL パラメ...

Vueタイマーの詳細な使い方

この記事では、参考までにタイマーを実装するためのVueの具体的なコードを紹介します。具体的な内容は次...

CSS3 を使用して左上または右上隅にリマインダー ドットを表示するサンプル コード

効果画像(三角形をご希望の場合は、ここをクリックしてください): コード: <html>...

クールなIoT大画面機能を実現するHTML+VUEページング

効果デモ.html <html> <ヘッド> <メタ文字セット=&qu...

UbuntuにProtobuf 3をインストールするための詳細なチュートリアル

いつインストールするかprotoc コマンドを使用しても Protoc が見つからない場合は、インス...