node.js + Express(4.x) + MySQL



## 環境構築
### 環境
* EC2(Amazon Linux)
* RDS
* node.js
 * Express 4.x
 * hotnode 0.0.8
 * mysql(モジール) 2.10.x 

### hotnode
通常のnodeコマンドで、Webサーバーを起動すると、ソースを書き換えるたびにnodeプロセスをリスタートする必要がある。
hotnodeを利用すると、ソースに変更があった場合、自動的にリスタートする。

* hotnodeインストール 

```
# yum install -y npm --enablerepo=epel
# npm -g install hotnode
```

### Expressフレームワーク
* [アプリケーション スケルトンの作成](http://expressjs.com/en/starter/generator.html)

```
# npm install express-generator -g
# express -h
# express sample_app ←対話式のプロジェクト作成
<<package.jsonの編集>>
# npm install
```
```js:package.json
{
  "name": "sample_app",
  "version": "0.0.0",
  "private": true,
  "scripts": {
#    "start": "node ./bin/www"
    "start": "hotnode ./bin/www"　# 起動するWebサーバーをhotnodeへ変更 
  },
  "dependencies": {
    "body-parser": "~1.13.2",
    "cookie-parser": "~1.3.5",
    "debug": "~2.2.0",
    "express": "~4.13.1",
    "jade": "~1.11.0",
    "morgan": "~1.6.1",
    "serve-favicon": "~2.3.0",
    "mysql": "2.*",              # mysqlモジュール追加
    "socket.io": "1.*",
    "redis": "2.*"
  }
}
```
* nodeサーバーの起動

```
# DEBUG=myapp:* npm start
----
http://{hostname}:3000/
```

### MySQLへの接続
```javascrept:app.js
var mysql = require('mysql');
var connection = mysql.createConnection({
  host: '',
  user: '',
  port: '',
  password: '',
  database: ''
});
connection.connect();
connection.query('select * from books', function(err, rows, fields) {
  if (err) throw err;
  console.log('The Name is: ', rows[0].name);
});
```



## 考察
インタラクティブ？なシステムを構築しそうな雰囲気が出てきたので、環境を構築しながら、つらつらと考えてみた。
（LAMPスタックで、便利フレームワークに慣れた身なので、概念の整理から始めないと……）

### node
* イベントドリブンの非同期プログラム
 * サーバーもクライアントもお互いにイベントを待つわ
* シングルプロセス
 * コードを一箇所でも間違えると、すべてを巻き込んで死ぬ……
 * コードを編集したら、node自体のリスタートが必要

### Expressフレームワーク
コントローラはどこだ！？MVCモデルとは少し違うよう

* モジュール
 * 最小単位。このモジュールの組み合わせで柔軟に構築できる
* app.js
 * ルート直下(/app.js)や、各機能ごとに（/login/app.js）に配置される。ルートハンドリングを行う
 * 各機能毎のapp.jsは、ルートのapp.jsに”マウント”される。
* ミドルウェア
 * コントローラーというよりは、モジュールを利用したアクションの集まり。各機能ごとのapp.jsから、”プラグイン”される。

### mysqlモジュール  
 * コネクションプール
  * レスポンスを返したら、コネクションを切るということができない
  * いざイベントが発生した時に、MySQL側のタイムアウトになってしまう可能性がある
  * コネクションをプールしておいて使い回すか、なければ生成する
  * コネクションプールを利用した場合、トランザクションが使えない
 * client.query
  * SQL文をメインプロセスとは別プロセスのSQLキューに入れて非同期で実行
  * キューの内部では、それぞれのSQL文を順番（同期）処理する  
 * ORM
  * Expressフレームワーク標準のORMは無いよう。
  * npmから自分で好きなのを選んでインストールしろと……
  * 検索では、[sequelize(ORM)モジュール](https://www.npmjs.com/package/sequelize)がよく引っかかる

単純な『mysql.createConnection()』を利用した場合、データの整合性は保たれそう。
『mysql.createPool()』は、ちょっと怪しい……。
PoolClusterにわざわざ、Master/Slaveの設定があるところを見ると、
更新系のクエリは、Masterに投げるとか、のコントロールが必要なのかもしれない。

## Tips
* MariaDB Client

```
# rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
```
```bash:/etc/yum.repos.d/mariadb.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0.24/centos6-x86
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
enabled=1
```
```
# yum install MariaDB-client
# mysql -h <endpoint> -P 3306 -u <mymasteruser> -p
```


## 参照
* [Express](http://expressjs.com/ja/starter/installing.html)
* [npm-search](https://www.npmjs.com/package/npm-search)
* [mysqlモジュール](https://www.npmjs.com/package/mysql)
* [sequelize(ORM)モジュール](https://www.npmjs.com/package/sequelize)