web-dev-qa-db-ja.com

NodeJS / mySQL-ER_ECCESS_DENIED_ERRORユーザー 'root' @ 'localhost'のアクセスが拒否されました(パスワードを使用:YES)

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に接続してもまったく問題はありません。

何か案は?

23
mwelk11

package.jsonで最新のMySQLバージョンを使用すると、問題が解決しました。

バージョン2.0.0を使用していました。バージョンを2.10.2に変更しました。

1
mwelk11

同じ問題があります。パスワードを空の文字列に変更することで解決しました。

var mysql = require('mysql');
var connection = mysql.createConnection({
    Host: 'localhost',
    user: 'root',
    password: ''
});
5
zhan mei yang

ポートフィールドを追加してみてください。

var connection = mysql.createConnection({
   Host: 'localhost',
   user: 'root',
   password: 'password',
   port: 3307

});

4
Rahul Paul

同様の問題がありました。 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が初めての人の助けになれば幸いです:)

3
kaiak

Mysqlバージョン2.16.0(2018年9月)の場合:

mysqlで新しいユーザーを作成するだけです。

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';

ユーザー名とパスワードを置き換えます。

2
Faris Hanugraha

私は同じ問題を抱えていたので、データベースユーザーのパスワードの変更は私のために働いた。次の手順を実行します :

  1. MySQL Workbenchを開きます

  2. 古いパスワードを使用してLocal instance MySQL57を開きます

  3. Server> Users and Privilegesに移動します
  4. パスワードを変更し、MySQLに再度ログインします。 OR newuserを作成し、特権を設定します。 (パスワードの変更が機能しない場合。)
1
marwari

//驚くことに、これは機能します。

var mysql = require('mysql');
var con = mysql.createConnection({
  Host: "localhost",
  user: "root",
  password: ""
});

con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
});
1

(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'
  }); 
1
YanivN

const pool = mysql.createPool({ Host: 'localhost', user: 'root', database: 'database_name', password: 'your_pwd' });

キーと適切なスペルを確認してください。私は同様の問題に直面していて、serの代わりにsernameと書いていることに気付きました

0
gaurish.salunke

Nodejsスクリプトで同じエラーが発生したため、パスワードパラメーターを削除しましたが、今では魔法のように正常に動作します

var mysql = require('mysql');
var connection = mysql.createConnection({
    Host: 'localhost',
    user: 'root'
});
0
hacktar

追加skip-grant-tables in my.ini(このファイルはmysqlのデフォルトのインストールパスで利用可能です)

[mysqld]

スキップグラントテーブル

ポート= 3306

0
Girish

誰かがまだ問題に直面している場合。試して

var mysql = require("mysql");
var con = mysql.createConnection({
  Host: "127.0.0.1",
  user: "your_username",
  password: "password",
  database: "your_db_name"
});
0
azm_shah

ほとんどの場合、入力したパスワードがMySQLサーバーによって解釈される方法に問題があります。以下のリンクに従ってください。問題が解決するはずです。 MySQL 8.0-クライアントはサーバーから要求された認証プロトコルをサポートしていません。MySQLクライアントのアップグレードを検討してください

0
Chaitanya

「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!");
 });
0
Vishnuvardhan

私にとっては、問題はSQL接続オブジェクトpass: 'mypassword' の代わりに password: 'mypassword'

0
Valchy

Localhostから外部サーバーに接続する場合は、MySQLの「Allowable Hosts」ボックスにゲートウェイルーターアドレスを追加する必要がある場合があります。

MySQL Allowable Hosts

このアドレスは、エラーメッセージの@記号の後にあります。

Access denied for user 'your_username'@'blah.blah.blah.yourisp.com'
0
Steve Breese