🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

解決済

2回答

4701閲覧

node.jsでMySQLに接続したいが、"Access denied for user" とエラーが出る

tokky08

総合スコア2

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

0クリップ

投稿2021/01/19 08:32

前提・実現したいこと

node.jsでMySQLに接続したいです。
しかし、npm run startで実行した時、以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'root'@'localhost' (using password: YES)

該当のソースコード

const mysql = require('mysql'); const con = mysql.createConnection({ host: "localhost", user: "root", password: "*****", }); con.connect()

試したこと

mysql -u root -p

ターミナルでこちらのコマンドはしっかりとログインでき、MySQLにアクセスできます。
しかし、nodeで実行した場合アクセスが拒否されます。パスワードは合ってます。
新しくユーザを作成して同様なことをしてもアクセスできません。権限を付与することも試しました。

補足情報(FW/ツールのバージョンなど)

mysql Ver 8.0.19 for osx10.13 on x86_64 (Homebrew)
node v13.8.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

mysql Ver 8.0.19 for osx10.13 on x86_64

あー、これは知ってないと分からないと思います。
言いたいことは下記の参考記事に全部書いてあります。

参考記事: 【node.js】MySQL8.0に接続できない。Error: ER_NOT_SUPPORTED_AUTH_MODE

まぁ、要約するとMySQL8はパスワードの管理方式が変わって
古いモジュールのmysqlは追従出来ていません。

mysqlモジュールの作者はとっくの昔に、
mysql2に移行しており
そちらで開発・新機能追加を行っています。

Promiseなんかも使えるので、
今後async/await構文でぶいぶいNode.js開発がしたいならmysql2へ移行しましょう。
使い方はmysqlモジュールとほぼ同じ使い方が出来るはずです。

js

1const mysql = require('mysql2'); // 使うモジュール名を変更しただけ 2 3const con = mysql.createConnection({ 4 host: "localhost", 5 user: "root", 6 password: "*****", 7}); 8 9con.connect()

開発用環境のMacにMySQLを入れるのは構築難易度が高く
権限周りの根深い問題だと思いますので、
ここはDockerを使ったMySQLサーバの構築法を案内します。
※最新のM1 MacだとまだDockerが使えないので環境構築を続ける必要がありますが……

Docker for Macを導入していなければ、
まず公式からダウンロードします。

DockerはCLIツールなので、
コンソールを開いて操作する必要があります。
端末を開くとdockerdocker-composeのコマンドが追加されて使えるようになっているはずです。

bash

1$ docker -v 2Docker version xx.xx.x, build xxxxxxx 3 4$ docker-compose -v 5docker-compose version x.xx.x, build xxxxxxx

Dockerの動作原理は
Linuxはディストリビューションが異なるOS間でも、
コンパイルした実行ファイルのファイルフォーマットが同一なので、
仮想的なHDDをひっつけてディレクトリ構成を同じにしてやれば動くでしょ?を元にしています。

因みにMacOSはOSが根本から違うので対象から外れますが、
Docker for Macにより仮想Linuxマシンを立ち上げて、
その中でDockerを動作させる事で実現しています。

Docker社はDocker Hubという
Dockerのイメージファイルを配布するサイトも運営しています。

その中には「MySQLサーバーを使える状態に設定済み」のイメージもあり、
無料で配布されているので誰でもダウンロードして使う事が出来ます。
参考リンク: mysql - Docker Hub

Dockerではdocker runコマンドを使う事で、
このDockerイメージファイルを元にコンテナを1個起動する事ができます。
(これはmysqlの説明書きにあった実行するファイルです)

bash

1$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

例えばこういうコマンドを--name some-mysqlのオプションを変えつつ3回実行すると、
MySQLサーバが3個作られて動作し始めます。

しかし、このコンテナというのはすぐ壊してまた起動し直すという思想で作られているので、
コンテナを作る度にdocker run ....を「じゅげむ」のように繰り返すわけです。
腱鞘炎になるわ。

そこで、コマンドをYAMLファイルに記述して保管しようという
Docker Composeをセットで利用します。
何も知識が無い所から設定するのは大変だと思うので、
私が最初から使える状態でdocker-compose.ymlファイルのテンプレートを用意しました。

仕様はとりまこんな感じです。

  • イメージはmysql8の最新を利用
  • ユーザ名root、パスワードpasswordで接続可能
  • localhost:3306で接続可能(ただし、コンソールから繋ぐ場合はホスト名を127.0.0.1にすること)
  • ファイルの永続化の為にvolumesに値を設定して、Macマシンからディレクトリを注入してそこにファイルを書かせる仕組みにしている
  • おまけとしてphpMyAdminも併設、http://localhost:4000で閲覧出来る

YAML

1version: "3.6" 2services: 3 db: 4 image: mysql:8 5 environment: 6 MYSQL_ROOT_PASSWORD: password 7 ports: 8 - 3306:3306 9 volumes: 10 - mysql-db:/var/lib/mysql 11 myadmin: 12 image: phpmyadmin/phpmyadmin 13 environment: 14 PMA_HOST: db 15 PMA_USER: root 16 PMA_PASSWORD: password 17 ports: 18 - 4000:80 19 20volumes: 21 mysql-db: 22 driver: local

まずこれをdocker-compose.ymlというファイルにして保存します。
同じディレクトリでdocker-composeコマンドを実行すると裏でYAMLファイルをロードして準備してくれるでしょう。

bash

1# 今の状態を確認する 2# 何も起動していないので何も表示されない 3$ docker-compose ps 4 5# バックグランドモードでコンテナ達を起動する 6# 初回はmysqlイメージのダウンロード等から始まるので時間がかかるはず 7$ docker-compose up -d 8 9$ docker-compose ps 10 Name Command State Ports 11----------------------------------------------------------------------------------------------- 12database_db_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp 13database_myadmin_1 /docker-entrypoint.sh apac ... Up 0.0.0.0:4000->80/tcp

投稿2021/01/19 08:54

編集2021/01/22 05:43
miyabi-sun

総合スコア21203

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi-sun

2021/01/19 08:56

あれ、でも表示されているエラー名が違いますね。 まぁひとまずmysql2に差し替えてみてください。
tokky08

2021/01/19 09:07

ありがとうございます。 mysql2に差し替えましたが、同じエラーを吐いてしまいますね、。
tokky08

2021/01/22 04:01

返信大変遅れてしまい申し訳ありません。 そちらも試しましたがダメのようです。 >無理ならDocker for Macを使った解決策を提示します。 こちらご教授いただきたいです。
hentaiman

2021/01/22 05:52

portを明示的に指定したらどうなりますか?よかったら試して教えてください
guest

0

自己解決

結果的にmysqlを再インストールすることで解決しました。原因は謎です。。。

$ brew uninstall mysql $ brew install mysql

このinstallする過程で色々エラーが出て、macOSのアップデートも行いました

投稿2021/01/22 08:49

tokky08

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問