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

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

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

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

Node.js

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

5回答

5337閲覧

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

shimon_

総合スコア26

MySQL

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

Node.js

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2020/10/11 14:43

質問

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

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

試したこと

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

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

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

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

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

よろしくお願いします。

ローカル環境に作ったDB

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

SQL

1mysql> show databases; 2+--------------------+ 3| Database | 4+--------------------+ 5| information_schema | 6| mysql | 7| nico_chart | 8| performance_schema | 9| sys | 10+--------------------+

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

Node

1const mysql = require('mysql'); 2const connection = mysql.createConnection({ 3 host:'localhost', 4 user:'root', 5 password: 'mysql', 6 database:'nico_chart' 7}); 8connection.connect((err) => { 9 if (err) { 10 console.log('error connecting: ' + err.stack); 11 return; 12 } 13 console.log('success'); 14});

発生しているエラー

Error

1error 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

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

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

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

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

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

guest

回答5

0

const mysql = require('mysql');

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

npm Node MySQL2

$ npm install mysql2

const mysql = require('mysql2');

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

/tmp/app $ node index.js
success

投稿2020/10/11 15:05

編集2020/10/11 23:57
technocore

総合スコア7337

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

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

0

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

「ローカルの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');
どちらでも接続することができました。

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

投稿2020/10/12 09:57

shimon_

総合スコア26

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

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

0

ベストアンサー

といった具合に、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 04:24

編集2020/10/12 04:30
dodox86

総合スコア9256

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

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

dodox86

2020/10/12 06:44

>@質問者さん まぁ、ご提示のエラーメッセージによるとmySQLへのログイン時のエラーなので、TCPでの接続自体はできているのだと思います。mySQLのRDBMSへのログイン認証で「mySQLサーバーが要求した認証の為の手順(プロトコル)をクライアントがサポートしていない。」とエラーメッセージに出ているので、私の回答は「どのようなプロセスでDBに接続できるのか」と言う疑問に対してサーバー/サーバー間の概念的なものを説明しただけのものとご認識ください。直接的に解決したい事項は他の回答者様のものが適切だと思います。
shimon_

2020/10/12 09:18

解説していただいてありがとうございます! とても勉強になりました。 自分が理解できる範囲で単純化しました。 『mySQLなどのサーバプログラムをインストールすると、PC内にそのプログラムの空間ができて、出入り口としてポート番号が割り当てられる。 mySQLのDBでなんらかの処理を行いたい場合、そのポート番号にアクセスする。自身の端末のIPアドレスは「localhost」、mySQLに割り当てたポート番号は、デフォルトでは「3306」。 なので、mySQLのDBにアクセスしたいときには「localhost:3306」を使う。』 ↑こう考えてみて疑問に思ったのですが、私が「ローカルのmySQLデータベースと接続する処理」において挙げた、mySQL接続テストコードですが、ここではポート番号についての記述がありません。 これは、mysqlライブラリが、そのあたりを、なんかいい感じ(曖昧)にやってくれてるのでしょうか?
dodox86

2020/10/12 09:33

> こう考えてみて疑問に思ったのですが... 「mySQL接続テストコード」とは、 > const mysql = require('mysql'); > const connection = mysql.createConnection({ このくだりでしょうか。 更に、このmysqlパッケージとはnpmでの以下のものでしょうか。 https://www.npmjs.com/package/mysql#connection-options であれば、Connection optionsの章にポート番号指定の記載があります。 > port: The port number to connect to. (Default: 3306) 'port'指定が無ければデフォルトで3306 が指定される、ということですね。指定しない場合は mySQLクライアントとして「イイ感じに設定」ということは言えていると思います。
dodox86

2020/10/12 09:38

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

2020/10/12 09:45

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

2020/10/12 10:08

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

0

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

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

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

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

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

sql

1select version();

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

試してみてください。

sql

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

投稿2020/10/12 06:02

miyabi-sun

総合スコア21203

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

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

0

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のバージョンが判りませんので断定できませんが以上が資料となります。

投稿2020/10/11 15:11

kuma_kuma_

総合スコア2506

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問