LoginSignup
9
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-05-29

環境構築

環境

  • 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

参照

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9