node.js勉強メモ 〜第１弾Expressの基礎について学ぶ〜

node.jsを学ぶにあたって取り組んだことをメモ形式ですが、段階を踏んで記載していきます。

まずは第一だんとしてメジャーなフレームワークExpressを学ぶにあたって[Expressの公式サイト](http://expressjs.com/ja/)のガイドが分かりやすかったので、メモ形式に記載してみます。

詳しくは公式サイトをご覧頂ければと思います。

## 第一ステップ：Expressについての学習メモ

### 【基礎】
- ジェネレーターは使いましょう！
- 静的ファイルを返すにはstaticなんちゃらでバインディングする必要がある

### 【ルーティング】
- 正規表現でもかけるのは便利
- 同じルーティングでも複数処理を実行後に処理を実行するなどが可能
   - ルーティングのハンドラーを配列で渡すことが出来る
- ルーティングの中で実施している next() ってなんだろ
   - Promiseでいうthenとかにつなげるための処理だったりするのかなぁ
- Routerをモジュール化する場合
   - /admin とか /contents とかURL以下をモジュール化する場合は下記一番下を参考
      - http://expressjs.com/ja/guide/routing.html

### 【ミドルウェアの作成】
- ミドルウェア呼び出しをnext()で表記するそうだ
   - 上記を記載しないとリクエストがハングしてしまう
      - （ハングってプロセスが残り続けることだったりするのかなぁ）
      - ミドルウェア関数 = ハンドラー的な感じなのかなぁ
- next()について
   - プリケーション内の次のミドルウェア関数が呼び出されます。
   - Node.js または Express API の一部ではない
   - ミドルウェア関数の第三引数であり、慣習的に常に「next」と呼ばれるため常にこの規則に従ってくださいとのこと。
      - お作法ってやつですねー
- ミドルウェアのロードは、常に最初に呼ばれたものが実行される。
   - ルートパスより後にメソッドを定義しても呼び出しはされないので注意！（結構重要やな）
   - app.use()ってなんなんだろう…

- 共通化する処理とかbefor的な役割をもたせる場合は上記を使えば良さそう
   - 共通で呼ばれるメソッドを最初に定義してapp.use()する
      - そのメソッドの中で認証なりなんなりをすればよさそうかなぁ
      - モジュールを切り替えれば認証有りなしとかの切り分けは可能っぽいので扱いやす
- 参考ページ:
   -  http://expressjs.com/ja/guide/writing-middleware.html


### 【ミドルウェアの使用】
- Expressのミドルウェアはめっちゃシンプル
   - 要求オブジェクト (req)、応答オブジェクト (res)、およびアプリケーションの要求応答サイクルにおける次のミドルウェア関数に対するアクセス権限を持つ関数のみ。

#### 「アプリケーションレベルのミドルウェア」
- app.use()はアプリケーションレベルのミドルウェア
   - アプリケーションが要求を受けるたびに呼ばれる
- app.use('正規表現’, function(){}) とすれば、リクエスト毎に必ず呼び出される処理を定義できそう！
   - が、ちゃんと設計していないとコードがぐちゃぐちゃになりそうな予感はしている
   - afterとか処理の最後にする共通処理って無いのかなぁ？
      - 各応答メソッドの中でres.sendとかせずにnext()とすれば良さそうな気がしてきた
      - 呼び出し順序のみ気をつけないといけないのは少し大変そう
- next('route');とすれば同じパスへの処理が記載されていた場合に次に記載されているルーティングテーブルに処理を遷移させられる

#### 「ルーター・レベルのミドルウェア」

- Expressの大元はappインスタンスにバインドする

   ```
   var app = express();
   var router = express.Router();
   ```

- Routerとしての機能のみ定義する場合はexpress.Router()で良い
- Routerで定義した場合はExpressオブジェクトに最後にapp.use(router)とバインドする必要はある
   - 複数Routerをここで定義して呼び出すことって出来るのかなぁ
      - http://expressjs.com/ja/guide/routing.html
      - 「express.Router」このパターンを利用すれば複数Routerは出来るんですねー

#### 「エラー処理ミドルウェア 」
- エラー処理ミドルウェアは常に 4 つ の引数を使用します。エラー処理ミドルウェア関数として識別されるように 4 つの引数を指定する必要があります。
   - 第４引数にエラーの変数が入るのかなぁって思ったけど、第１引数に割り込んでくるんや！マジか！

#### 「標準装備のミドルウェア」
- Express v3まではnodeのHTTPフレームワーク Connectに通信周りは依存していたようですね
   - http://qiita.com/ledsun/items/4c9783d30df3170403db
   - Express の唯一の標準装備のミドルウェア関数は express.static だそう！
      - 静的ファイルを返すようなときには下記資料を見ればアクセス制御などミドルウェアレベルで簡単に出来るとのこと
      - http://expressjs.com/ja/guide/using-middleware.html　「標準装備のミドルウェア 」

#### 「サード・パーティー・ミドルウェア」
- 普通にnpmでインストールして、requierで呼び出してapp.use()でバインディングすれば良さそう！

### 【Express でのテンプレート・エンジンの使用】
今回はREST APIを想定しているので割愛

#### 【エラー処理 】
- 第４引数に入ってくるんじゃなくて第１引数に割り込んでくるのか！マジか！

   ```
   // 通常のリクエスト
   app.use(function( req, res, next) {
   // エラー処理系のリクエスト
   app.use(function(err, req, res, next) {
   ```
 
- 複数のエラー処理（ログ出力とレスポンスとか）は、別々の定義にした場合 next(err);  で次を呼び出すことが出来す
- 応答メソッドの切り替えなどもここで吸収できそうですね！
   - if (req.xhr) { res.send() } else { res.render(); } みたいな感じ
- 環境変数の設定は下記のようみたい
   - アプリケーションを実動モードで実行するには、環境変数 NODE_ENV を production に設定

### 【Express のデバッグ】
- 環境によって出力の切り替えは内部的にやってくれるみたいなのでコードとしてデバッグメッセージの出力は残しておいても問題ないみたいー！
   - console.logだとフロントだとminifyとかconcatするときのオプションで削除するようなことはあるもんなぁー
　
- 全てのログメッセージの出力方法
   - DEBUG=express:* node index.js

### 【プロキシーの背後の Express】
- app.set('trust proxy', 'loopback’); を設定していないとnginxで受けてSSL通信させるとかのときに上手く動作してくれない模様
   - 参考：NodeJS expressをリバースプロキシさせた時にreq.protocolを取れない
      - http://qiita.com/hiro93n/items/64248fa934ee9fa9cab4
      - 結構嵌りそうなポイントですねー

### 【データベースの統合】
- 単にデータベースに適切な Node.js ドライバーをアプリケーションにロードするだけっぽい！
   - http://expressjs.com/ja/guide/database-integration.html#mongo
   - 環境によって接続先を変えたりModelの機能を利用したりとどうやって設計するのかは調べてみたい
   - が、Expressとしての機能ではないのかなぁー

-------

まだ触り始めですが凄い入りやすいフレームワークだなぁと感じつつ、
Socket.ioをどのようにフレームワークに取り込んで設計するのか、モジュールをどこまで分割するのかとかConfigをどう分ければいいのかなどなど...
Expressを利用した設計みたいなところがいまいちピンときていないので次回はそれについて学んでいきたいです。