MAC:node.jsでmysqlへ接続する

node.js から mysqlに接続するのに苦労しましたので覚書をします。

##環境
  macOS   : 10.15.5 (Catalina)
  node.js : v14.3.0
  mysql   : ver 8.0.19


#mysqlインストール
```shell:shell
$ brew install mysql
```
でインストールされました。
（他の情報でmpnを使用するやり方が書いてありましたが、私の環境では起動ができませんでした）

##コネクションを実行するコード
```javascript:mysqlconnection.js
//------------------------------------------------------------
//      my sql connection
//------------------------------------------------------------
var mysql = require('mysql');

//DBの定義
var dbConfig = {
  host     : 'localhost', //接続先ホスト
  user     : 'root',      //ユーザー名
  password : '******',    //パスワード
  database : '******'     //DB名
};

var connection;

function handleDisconnect() {
    console.log('create mysql connection');
    connection = mysql.createConnection(dbConfig); //接続する準備

    //接続
    connection.connect(function(err) {
        if(err) {
            console.log('error when connecting to db:', err);
            setTimeout(handleDisconnect, 2000); //2秒待ってから処理
        }
    });

    //error時の処理
    connection.on('error', function(err) {
        console.log('db error', err);
        if(err.code === 'PROTOCOL_CONNECTION_LOST') {
            handleDisconnect();
        } else {
            throw err;
        }
    });

    module.exports = connection; //connectionを(他のファイルから)requireで呼び出せるようにする
}

handleDisconnect();
```

実行するにはシェル（ターミナル）に以下を入力します

```shell:shell
   $ node mysqlconnection.js
```

#エラー発生
私の環境では上記を実行してもエラーが出ました。

 1. mysqlが起動していない場合のエラー

```
 errno: -61,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 3306,
  fatal: true
```
このエラーの対処は

```shell:shell
  $ mysql.server start
```
とします。

2.認証方法エラー
新しいmysqlで認証方法が変更になっていてnode.jsからは古い認証方法でアクセスするためにそれに合わせる必要があるようです。

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

この対処は以下を参照しました。

[Node.jsでMySQL 8.0へ接続しようとする時に発生するエラー](https://qiita.com/miriwo/items/1880e9d2ebcfd3c0e60d)

ですがこれをこのままやってもうまくいかず

mysqlの初期パスワードをクリアする必要がありました。
他のサイトではvar/log/mysqld.log に初期パスワードが残っているとの情報があったのですが、私の環境ではありませんでした。
それで以下の記事

[Mac ローカル環境の MySQL 8.0 のrootパスワードを忘れた時のリセット方法](https://qiita.com/miriwo/items/1880e9d2ebcfd3c0e60d)

を参考にて、
1.サーバーを停止
```$ mysql.server stop```
2.MySQLをセーフモードで起動する。
```$ mysqld_safe --skip-grant-tables &```
3.rootユーザのパスワード無し状態でログインする。（同じターミナルで大丈夫でした)
```$ mysql -u root```
4.rootユーザーのパスワードを空に設定する。
```mysql> UPDATE mysql.user SET authentication_string=null WHERE User='root';```
5.セーフモードで開いたMySQLを閉じる
```mysql> exit```
6.セーフモードで動作しているMySQLをkillする。
```$ mysql.server status
SUCCESS! MySQL running (XXXXX)
$ kill XXXXX
```
7.通常モードでMySQLを起動する。
```$ mysql.server restart```
8.rootでmysqlを起動する。（パスワード要求されるがENTERをおす。)
```$ mysql -u root -p```
9.パスワードを再設定する。
```mysql> USE mysql;```
10.ここで先ほどの
[Mac ローカル環境の MySQL 8.0 のrootパスワードを忘れた時のリセット方法](https://qiita.com/miriwo/items/1880e9d2ebcfd3c0e60d)
に書いてあるSQLを実行します

```sql:
mysql > ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
```

passwordの部分はrootでログインを行う際の任意のパスワードです。

ここまで実行するとこのエラーはなくなります。

##その他注意
・node.jsからmysqlへアクセスするにはmysqlにdbを作成する必要があります。

```sql:mysql
 mysql>create db _test
```
・mysqlconnection.jsは作成したdbと、設定パスワードを記述する必要があります

```javascript:mysqlconnection.js
var dbConfig = {
  host     : 'localhost', //接続先ホスト
  user     : 'root',      //ユーザー名
  password : '******',    //パスワード
  database : '******'     //DB名
};
```