Node
MySQL
Express

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

More than 1 year has passed since last update.


環境構築


環境


  • 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


参照