質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

87.78%

ローカルで作成したDBに接続する方法。概念が理解できない。Node, Express, mySQL

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 1,323

score 24

質問

基本的な質問で申し訳ありません。

テスト環境として、mySQLでローカルにDBを作成したのですが、接続方法がわかりません。
接続方法を教えていただけないでしょうか?

試したこと

ググるとnode, express環境での接続方法はたくさん出てくるのですが、自分の環境ではエラーとなってしまいます。以下のコード部分では、実行した一つの例を挙げました。

CLIで、mySQLにログインはできています。

そもそも私の理解が至っていないのが問題なのですが、DBに接続するために何が必要なのか、どういったプロセスで繋がるのかわかっていません。

なんとなく、DBにもアドレスがあって、そのアドレスを使って接続するのかなぁ…と思っています。そして、ローカル環境ではlocalhost+何か(?)がアドレスになるのかな、と。express起動してページ表示させるのも、[localhost:8000] でアクセスできるし。

といった具合に、DBと接続する概念が自分のなかで言語化できていません。どのようなプロセスでDBに接続できるのか、ご教授いただければとても助かります。

よろしくお願いします。 

ローカル環境に作ったDB

nico_chatというDBに接続しようとしています。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| nico_chart         |
| performance_schema |
| sys                |
+--------------------+

ローカルのmySQLデータベースと接続する処理

const mysql = require('mysql');
const connection = mysql.createConnection({
  host:'localhost',
  user:'root',
  password: 'mysql',
  database:'nico_chart'
});
connection.connect((err) => {
  if (err) {
    console.log('error connecting: ' + err.stack);
    return;
  }
  console.log('success');
});

発生しているエラー

error connecting: Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client

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

参考としたサイト:https://prog-8.com/docs/nodejs-mysql
環境:Linux, Node, Express, mySQL

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+2

const mysql = require('mysql');

mysqlではなくmysql2を使ってみたらどうなるでしょうか?

npm Node MySQL2

$ npm install mysql2

const mysql = require('mysql2');

(追記)
mysql2をrequireしてあなたのソースコードを走らせると、とりあえずエラー無く動きました。
試してみてください。

/tmp/app $ node index.js
success

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+1

といった具合に、DBと接続する概念が自分のなかで言語化できていません。どのようなプロセスでDBに接続できるのか、ご教授いただければとても助かります。

mySQLもそうですが、多くのサーバープログラムは、起動するとそのマシン上で常駐し、通信用の受け口を開いて待っています。その通信回線となるものはTCP/IPの内のTCPであり、UDPであることもあるし、UNIXドメインソケットであることもあります。受け口とはひとつのマシン上でも複数開くことができて、それぞれがTCPであればTCPポート番号を割り当てます。mySQLの既定(デフォルト)のTCPポート番号は3306番です。WEBブラウザでよく使うHTTPは、既定では80番です。mySQLをはじめとするサーバープログラムは、その番号のポートを通じて接続(connect)してきたクライアントからの要求(リクエスト)メッセージに応え、何らかの処理をし、応答(レスポンス)をクライアントに返すのが一般的な動きです。その何らかの処理が、DBサーバーであればクエリーの実行であったり、様々な更新処理となります。

localhostとはその呼び名の通り、ローカルのマシンを指します。これは通常、IPアドレスとして127.0.0.1を指していて、自分自身を指しているため、ループバックアドレスとも呼ばれます。localhost:8000と書くと、アドレスがlocalhost、すなわち自分自身のマシンで、8000番のTCPポート番号でクライアントからの接続を待ち受けている。あるいはクライアントからはそれで接続できる、とのような意味になるでしょう。mySQLで言えばそれがlocalhost:3306です。尚、混乱しやすいですが、ポート番号はクライアントにとって接続元(source)と接続先(destination)の2つがあります。上記の3306や8000はクライアントからみた接続先、サーバー側からみた接続待ち(LISTEN)しているポート番号になります。この辺りはクライアント/サーバー型のソケットプログラミングを勉強すると良く分かってきます。

サーバー、クライアント間の接続の概念図としては以下のようになるでしょうか。尚、ここで言う「クライアント」とは「サーバー」へ能動的に接続しに行く立場を示すもので、反対に「サーバー」とは「クライアント」からの接続要求に対して接続を受け付ける立場を示しています。

("==>"はクライアントがサーバーに接続する方向)

WEBブラウザなど ==> WEBサーバー(TCP80番ポートで接続待ち) ==> mySQL(TCP3306番ポートで接続待ち)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/10/12 18:38

    追加で書き忘れたのですが、localhostに指定するのはWEBサーバーを含んだアプリケーションサーバーからのDBサーバーへの接続について、それなりに意味があります。同じマシンに同居しているクライアントからの接続のみ受け付ける、ということで、外部のリモートのマシンから接続できないようになるので、セキュリティ上でも有利です。

    キャンセル

  • 2020/10/12 18:45

    重ね重ねありがとうございます!

    キャンセル

  • 2020/10/12 19:08

    あれ、解決への直接的な回答ではなかったのにBAを頂戴してしまい、恐縮です。どうもありがとうございます。

    キャンセル

+1

ユーザー名が間違っていたから接続できなかったようです。

「ローカルのmySQLデータベースと接続する処理」において挙げたコード

const connection = mysql.createConnection({
host:'localhost',
user:'root',
password: 'mysql',
database:'nico_chart'
});

において、「user: 'root'」を、「user: '自身で設定したユーザ名'」に変更すると、接続することができました。
皆さんにアドバイスしていただいて、自分が勘違いしていたことに気づきました。
私の勘違いとは、user:'root'のrootとは、管理者権限のことを指していて、rootと指定するとユーザ名関係なくすべてのDBに入れるものだ、ということです。

ユーザ名を指定すると、
const mysql = require('mysql');
および、
const mysql = require('mysql2');
どちらでも接続することができました。

たくさんアドバイスしていただきありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

エラー文からは認証失敗しているよーというのは分かりますね。

当然パスワードは一致しているだろうし、
認証で弾かれているということはポート番号も正しいはず。

ううむ、わからん
というわけでエラー文でググってこんな記事見つけました。
参考記事: Node.jsでMySQL 8.0へ接続しようとする時に発生するエラー - Qiita

MySQL8.0の認証形式Node.jsのmysqlライブラリが追従できていない
なんかそれっぽいですね。
MySQLのバージョンが8であることを確認してみてください。

CLIで接続出来るならば、
下記のSQLを投げれば結果が帰ってくるはずです。

select version();

もし8系であればの話ですが、
CLIからこのSQLを実行させて挙動を変更すれば使えるんじゃないでしょうか?

試してみてください。

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysql'

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-2

error connecting: Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client

接続エラー:エラー:ER_NOT_SUPPORTED_AUTH_MODE:クライアントはサーバーから要求された認証プロトコルをサポートしていません。 MySQLクライアントのアップグレードを検討してください

B.5.2.4 クライアントは認証プロトコルに対応できません

6.3.8.2 古いネイティブ認証プラグイン

6.3.8.1 ネイティブ認証プラグイン

第78回 MySQLプロトコルのハンドシェイクパケットを眺めてみる

MySQLのバージョンが判りませんので断定できませんが以上が資料となります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る