環境構築
環境
- 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フレームワーク
# npm install express-generator -g
# express -h
# express sample_app ←対話式のプロジェクト作成
<<package.jsonの編集>>
# npm install
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への接続
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)モジュールがよく引っかかる
単純な『mysql.createConnection()』を利用した場合、データの整合性は保たれそう。
『mysql.createPool()』は、ちょっと怪しい……。
PoolClusterにわざわざ、Master/Slaveの設定があるところを見ると、
更新系のクエリは、Masterに投げるとか、のコントロールが必要なのかもしれない。
Tips
- MariaDB Client
# rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
/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