NodeJSファイルを介してmySQLに接続しようとしていますが、次のエラーが表示されます。
{ Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'root'@'localhost' (using password: YES)
at Handshake.Sequence._packetToError (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/sequences/Sequence.js:30:14)
at Handshake.ErrorPacket (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/sequences/Handshake.js:67:18)
at Protocol._parsePacket (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/Protocol.js:197:24)
at Parser.write (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/Parser.js:62:12)
at Protocol.write (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/Protocol.js:37:16)
at Socket.ondata (_stream_readable.js:555:20)
at emitOne (events.js:101:20)
at Socket.emit (events.js:188:7)
at readableAddChunk (_stream_readable.js:176:18)
at Socket.Readable.Push (_stream_readable.js:134:10)
--------------------
at Protocol._enqueue (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/Protocol.js:110:26)
at Protocol.handshake (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/Protocol.js:42:41)
at Connection.connect (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/Connection.js:81:18)
at Connection._implyConnect (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/Connection.js:222:10)
at Connection.query (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/Connection.js:137:8)
at Object.<anonymous> (/home/matthew/Node/mySqlTest/index.js:11:12)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
code: 'ER_ACCESS_DENIED_ERROR',
errno: 1045,
sqlState: '28000',
fatal: true }
奇妙なことは、mysql -u root -p
を実行することで、ターミナルを介してうまく接続できることです。このエラーは、javascriptを実行したときにのみ発生します。私はGoogleとStackOverflowを使いこなしてきましたが、まだ機能するソリューションは見つかりませんでした。仮想マシンのUbuntu 16.04.1でMySQL 5.7.16を使用しています。ここでVMが違いを生むかどうかわからない。私のJavascriptコードは以下の通り:
'use strict';
var mysql = require('mysql');
var connection = mysql.createConnection({
Host: 'localhost',
user: 'root',
password: 'password'
});
connection.query(
'SELECT "foo" AS first_field, "bar" AS second_field',
function(err, results, fields) {
console.log(err);
console.log(results);
connection.end();
}
);
Javascriptで「locahost」と「127.0.0.1」を使用してみました。 mySql.userテーブルに「localhost」と「127.0.0.1」の両方の「root」ユーザーがあり、SELECT user, Host FROM mysql.user WHERE user='root';
を実行することでこれを確認できます。
これを実行することにより、「root」ユーザーに特権を追加しました。
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password';
127.0.0.1でも上記を実行しました。私もこれを試しました:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION
次のようにルートパスワードをリセットしようとしました: https://help.ubuntu.com/community/MysqlPasswordReset
各試行の後にFLUSH PRIVILEGES
を実行しました。 mySQLを停止して再起動しました。 mySQLを完全にアンインストールし、再インストールしました。
すべて役に立たない。 javascriptを実行しようとするたびにアクセス拒否エラーが表示されますが、ターミナル経由でmySQLに接続してもまったく問題はありません。
何か案は?
package.jsonで最新のMySQLバージョンを使用すると、問題が解決しました。
バージョン2.0.0を使用していました。バージョンを2.10.2に変更しました。
同じ問題があります。パスワードを空の文字列に変更することで解決しました。
var mysql = require('mysql');
var connection = mysql.createConnection({
Host: 'localhost',
user: 'root',
password: ''
});
ポートフィールドを追加してみてください。
var connection = mysql.createConnection({
Host: 'localhost',
user: 'root',
password: 'password',
port: 3307
});
同様の問題がありました。 Dockerコンテナでmysqlを実行していて、ノードアプリからmysqlに接続しようとすると同じエラーが発生しました。
ポートを公開せずにDockerコンテナーを実行したため、コンテナー内は3306でしたが、localhost:3306からはアクセスできなかったようです。 ER_ACCESS_DENIED_ERRORエラーが発生した理由は、実際にはポート3306で別のユーザー名とパスワードを使用して他のmysqlサーバーを実行していたためです。
特定のポートタイプで実行しているかどうか、または何を確認するには:
ps axu | grep 3306
既にポート3306に何かがあるので、サーバーがアプリにアクセスできるようにするために、ポートを3307に変更し、次のコマンドでdocker mysqlコンテナーを実行します。
docker run --name=<name> -e MYSQL_ROOT_PASSWORD=<password> -p 3307:3306 -d mysql
コマンドを使用してDocker内でmysqlクライアントを起動した後:
docker exec -it <name> mysql -u root -p
接続するデータベースを作成した後、次の行を使用してノードアプリからmysql dbに接続できました。
const connection = mysql.createConnection({
Host: 'localhost',
user: 'root',
password: 'password',
database: 'database',
port: 3307
});
connection.connect();
Dockerとmysqlが初めての人の助けになれば幸いです:)
Mysqlバージョン2.16.0(2018年9月)の場合:
mysqlで新しいユーザーを作成するだけです。
GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';
ユーザー名とパスワードを置き換えます。
私は同じ問題を抱えていたので、データベースユーザーのパスワードの変更は私のために働いた。次の手順を実行します :
MySQL Workbench
を開きます古いパスワードを使用して
Local instance MySQL57
を開きますServer
>Users and Privileges
に移動します- パスワードを変更し、MySQLに再度ログインします。
OR
newuserを作成し、特権を設定します。 (パスワードの変更が機能しない場合。)
//驚くことに、これは機能します。
var mysql = require('mysql');
var con = mysql.createConnection({
Host: "localhost",
user: "root",
password: ""
});
con.connect(function(err) {
if (err) throw err;
console.log("Connected!");
});
(rootを使用する代わりに)新規ユーザーを作成すると、問題が修正されました。
mysql> CREATE USER 'new_user'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)
次に付与します:
mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'new_user'@'%' WITH GRANT OPTION;
次に、資格情報を変更します。
var connection = mysql.createConnection({
Host : 'The mysql IP',
port : 'The mysql Port',
user : 'new_iser',
password : 'new_user_pass',
database : 'database-name'
});
const pool = mysql.createPool({ Host: 'localhost', user: 'root', database: 'database_name', password: 'your_pwd' });
キーと適切なスペルを確認してください。私は同様の問題に直面していて、serの代わりにsernameと書いていることに気付きました
Nodejsスクリプトで同じエラーが発生したため、パスワードパラメーターを削除しましたが、今では魔法のように正常に動作します
var mysql = require('mysql');
var connection = mysql.createConnection({
Host: 'localhost',
user: 'root'
});
追加skip-grant-tables in my.ini(このファイルはmysqlのデフォルトのインストールパスで利用可能です)
[mysqld]
スキップグラントテーブル
ポート= 3306
誰かがまだ問題に直面している場合。試して
var mysql = require("mysql");
var con = mysql.createConnection({
Host: "127.0.0.1",
user: "your_username",
password: "password",
database: "your_db_name"
});
ほとんどの場合、入力したパスワードがMySQLサーバーによって解釈される方法に問題があります。以下のリンクに従ってください。問題が解決するはずです。 MySQL 8.0-クライアントはサーバーから要求された認証プロトコルをサポートしていません。MySQLクライアントのアップグレードを検討してください
「root」@「localhost」を「root」に変更したときに、ユーザーセクションに完全なユーザー名を指定することで、この問題に直面しました。
var mysql = require('mysql');
var con = mysql.createConnection({
Host: hostname,
user: "root",
password: "rootPassword"
});
con.connect(function(err) {
if (err) throw err;
console.log("Connected!");
});
私にとっては、問題はSQL接続オブジェクトpass: 'mypassword'
の代わりに password: 'mypassword'
。