私はnode.jsとMySQLの初心者で、基本的なコードを設定して試してみました。しかし、どういうわけか単純なサーバーへの接続さえできません。 Node.JSと一緒に最新のMySQL Community 8.0データベースをデフォルト設定でインストールします。
これは私のnode.jsコードです
var mysql = require('mysql');
var con = mysql.createConnection({
Host: "localhost",
user: "root",
password: "password",
insecureAuth : true
});
con.connect(function(err) {
if (err) throw err;
console.log("Connected!");
});
以下はコマンドプロンプトに表示されるエラーです。
C:\Users\mysql-test>node app.js
C:\Users\mysql-test\node_modules\mysql\lib\protocol\Parse
r.js:80
throw err; // Rethrow non-MySQL errors
^
Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
at Handshake.Sequence._packetToError (C:\Users\mysql-
test\node_modules\mysql\lib\protocol\sequences\Sequence.js:52:14)
at Handshake.ErrorPacket (C:\Users\mysql-test\node_mo
dules\mysql\lib\protocol\sequences\Handshake.js:130:18)
at Protocol._parsePacket (C:\Users\mysql-test\node_mo
dules\mysql\lib\protocol\Protocol.js:279:23)
at Parser.write (C:\Users\mysql-test\node_modules\mys
ql\lib\protocol\Parser.js:76:12)
at Protocol.write (C:\Users\mysql-test\node_modules\m
ysql\lib\protocol\Protocol.js:39:16)
at Socket.<anonymous> (C:\Users\mysql-test\node_modul
es\mysql\lib\Connection.js:103:28)
at Socket.emit (events.js:159:13)
at addChunk (_stream_readable.js:265:12)
at readableAddChunk (_stream_readable.js:252:11)
at Socket.Readable.Push (_stream_readable.js:209:10)
--------------------
at Protocol._enqueue (C:\Users\mysql-test\node_module
s\mysql\lib\protocol\Protocol.js:145:48)
at Protocol.handshake (C:\Users\mysql-test\node_modul
es\mysql\lib\protocol\Protocol.js:52:23)
at Connection.connect (C:\Users\mysql-test\node_modul
es\mysql\lib\Connection.js:130:18)
at Object.<anonymous> (C:\Users\mysql-test\server.js:
11:5)
at Module._compile (module.js:660:30)
at Object.Module._extensions..js (module.js:671:10)
at Module.load (module.js:573:32)
at tryModuleLoad (module.js:513:12)
at Function.Module._load (module.js:505:3)
at Function.Module.runMain (module.js:701:10)
https://dev.mysql.com/doc/refman/5.5/en/old-client.htmlhttps://github.com/mysqljs/ mysql/issues/1507
しかし、私はまだ私の問題を解決する方法がわからない。任意の助けがいただければ幸いです:D
MYSQLワークベンチで以下のクエリを実行します。
Mysql_native_passwordと 'password'で識別されるALTER USER 'root' @ 'localhost'
接続後にノードを使用して接続してみてください
古いmysql_native_password
を使うとうまくいきます:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourRootPassword';
-- or
CREATE USER 'foo'@'%' IDENTIFIED WITH mysql_native_password BY 'bar';
-- then
FLUSH PRIVILEGES;
これはcaching_sha2_password
がMySQL 8.0で導入されたが、Node.jsバージョンがまだ実装されていないためです。あなたは このプルリクエスト そして この問題 を見ることができます。おそらくすぐに修正が行われるでしょう。
まず、何が起こっているのかを明確にしましょう。
MySQL 8はプラグ可能な認証方法をサポートしています。デフォルトでは、古くなったcaching_sha2_password
( source )ではなく、mysql_native_password
という名前の1つが使用されます。いくつかのハンドシェイクで暗号アルゴリズムを使用することは、 24年 に存在していた単純なパスワードの受け渡しよりも安全であることは明らかです。
現在、問題はNodeのmysqljs
(npm i mysql
でインストールし、Nodeコードで使用するパッケージ)がこの新しいデフォルトをサポートしていないことです。 MySQL 8の認証方式。問題はここにあります: https://github.com/mysqljs/mysql/issues/1507 であり、3年後の2019年7月時点でまだ開いています。(UPDATE June 2019:これを修正するための mysqljsの新しいPR があります!)
ここで誰もが提案していることです(例: 上記のトップアンサー )。 mysql
にアクセスして、認証に古いnative_password
メソッドを使用してroot
で問題ないというクエリを実行します。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password ...
良いことは、人生はシンプルになり、Sequel Proのような古き良きツールを 任意の問題 なしで使用できることです。しかし、問題は、あなたが利用できるより安全な(そしてクールな、以下を読んで)ものを利用していないことです。
NodeのMySQL X DevAPI は、 http://dev.mysql.com によって提供される NodeのMysqljsパッケージ の代わりになります。
caching_sha2_password
認証をサポートするチャームのように機能します。 (必ず Xプロトコル通信 にポート33060
を使用してください。)
悪いことは、あなたが私たちの古いmysql
パッケージを残しているので、誰もが慣れて依存しているということです。
良いことは、あなたのアプリがより安全になり、古き良き友人が提供しなかったたくさんの新しいものを活用できることです! X DevAPIのチュートリアル をご覧ください。便利な機能がたくさんあります。学習曲線の料金を支払うだけで、テクノロジーのアップグレードに伴うことが予想されます。 :)
PS。残念ながら、このXDevAPIパッケージにはまだ型定義(TypeScriptが理解できる)がないため、TypeScriptを使用している場合は問題が発生します。 dts-gen
およびdtsmake
を使用して.d.tsを生成しようとしましたが、成功しませんでした。それを覚えておいてください。
乾杯!
受け入れられた答えは正しいですが、私は新しいユーザーを作成してからそのユーザーを使用してデータベースにアクセスすることを望みます。
create user nodeuser@localhost identified by 'nodeuser@1234';
grant all privileges on node.* to nodeuser@localhost;
ALTER USER 'nodeuser'@localhost IDENTIFIED WITH mysql_native_password BY 'nodeuser@1234';
$ mysql -u root -p
Enter password: (enter your root password)
(your_new_password
を使用したいパスワードに置き換えます)
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';
mysql> FLUSH PRIVILEGES;
mysql> quit
それからノードを使って接続してみてください
Mysqlの最新dockerコンテナ
ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';
このエラーが発生しても、MySQLバージョン8を使用したい場合は、Dockerを使用してデータベースを作成するときにレガシー認証プラグインを使用するようにMySQLサーバーに指示することでこれを実行できます。
したがって、作成ファイルは次のようになります。
# Use root/example as user/password credentials
version: '3.1'
services:
db:
image: mysql:8.0.15
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: 'pass'
MYSQL_DATABASE: 'db'
MYSQL_USER: 'user'
MYSQL_PASSWORD: 'pass'
ports:
- 3318:3306
# Change this to your local path
volumes:
- ~/Database/ORM_Test:/var/lib/mysql
ALTER USER ...コマンドラインが機能しない場合、およびWindows 10を使用している場合は、次の手順を試してください。
1)Windowsの検索バーに「MySQL」と入力します
2)MySQL Windowsインストーラーを開く-コミュニティ
3)「MySQLサーバー」を探し、「再構成」をクリックします
4)「認証方法」フェーズに到達するまで「次へ」をクリックします
5)「認証方法」フェーズで、2番目のオプション「レガシー認証方法を使用」をチェックします
6)次に、Windowsインストーラーによって指定された手順を最後まで実行します
7)完了したら、Windowsの検索バーから[サービス]に移動し、[開始] MySql81をクリックします。
さて、もう一度試してください。MySQLとNode.js間の接続が機能するはずです!
あなたがここで見つけることができるオリジナルの文書: https://dev.mysql.com/doc/dev/connector-nodejs/8.0/
'use strict';
const mysqlx = require('@mysql/xdevapi');
const options = {
Host: 'localhost',
port: 33060,
password: '******',
user: 'root',
schema: 'yourconference'
};
mysqlx.getSession(options)
.then(session => {
console.log(session.inspect());
session.close();
}).catch(err => {
console.error(err.stack);
process.exit(1);
});
私はサーバー上のMYSQLと他のサーバー上のnodejsアプリケーションを持っています
MYSQLワークベンチで以下のクエリを実行します。
Mysql_native_passwordを 'password'で識別したユーザー 'root' @ '%'の変更
MySQLサーバーのインストーラーを実行し、私のSQLサーバーを再設定するだけです…これは私にとってはうまくいきました。
MySQLユーザーの特権とユーザー名/パスワードを確認します。
エラーをキャッチするには、オーバーライドされた_delegateError
メソッドを使用すると常に便利です。あなたの場合、これは次のように見える必要があります。
var mysql = require('mysql');
var con = mysql.createConnection({
Host: "localhost",
user: "root",
password: "password",
insecureAuth : true
});
var _delegateError = con._protocol._delegateError;
con._protocol._delegateError = function(err, sequence) {
if (err.fatal)
console.trace('MySQL fatal error: ' + err.message);
return _delegateError.call(this, err, sequence);
};
con.connect(function(err) {
if (err) throw err;
console.log("Connected!");
});
この構造は、致命的なエラーを追跡するのに役立ちます。
私はMySQLと同じ問題を抱えていて、XAMPPを使用してMySQLに接続し、MySQL用のウィンドウ(コントロールパネル - 管理ツール - サービス)、およびフォルダdb.js(データベースを管理する)でサービスを停止することで解決します。パスワードを空にする(ここであなたは見ることができる:)
const mysql = require('mysql');
const connection = mysql.createConnection({
Host: 'localhost',
user: 'root',
password: ''
});