先日、Node学園 19時間目に参加した際にnodalというNode.jsのフレームワークを知りました。
というか、自分、Expressしか知りませんでした。しかも名前だけ。KoaとかHapiとか、色々あるんですね。
Node学園では、nodalは新進気鋭の新興勢力として紹介されていました。なので、新しいものをまず触ってみよう!と思い、ちょっとアプリケーションを作ってみようと思います。
このポストでは、以下の公式ページに従って、作業を進めていきます。
インストール
何はともあれインストール。
ちなみに、初回のインストールには失敗しましたw Nodeのバージョンが古かったため、nodalのコマンドが全てエラーになる事態に。
ちゃんと4系以上にしなさいよと書いてありました。
Node.jsの公式を見てみると、どうやら5.6.0が最新のstableのよう。
せっかくなので、思い切って5.6を入れました。と言っても、nodebrewを使っているので安心なんですけどね。
さて、いよいよnodalのインストールです。
$npm install -g nodal
きちんと関連パッケージがインストールされました。nodalは現在バージョン0.7.3なんですね。
ちなみにこちらがコマンド一覧。
見やすいですね。好感が持てます。
新規プロジェクト作成
では、新規プロジェクトを作成していきます。今回は英単語アプリケーションを作成する予定です。TOEIC900点レベルの英単語を扱う予定なので、After900という名前にします。
$ nodal new After900
プロジェクト作成コマンドを入力すると、いくつかの設定事項を聞かれます。
ほおほお、Herokuサポートしれくれるんですね。嬉しいです。
Task Schedulerってなんだろう。。とりあえずYesにしました。
そして作成後にこんなメッセージが。
なんだかポップでいいですね。僕みたいな初心者向けな感じがしてきました。
ちなみに、生成されたディレクトリ構造はこんな感じ。
app,config,db,initializers,test,node_modulesは、ふんふんって感じ。
middleware, renderware, staticあたりがよくわからないぞ。。。わくわく。
サーバ起動
以下のコマンドでローカルサーバを起動することができます。
$ nodal s
そしてローカルホストの3000番にアクセスすると、以下のようなWelcome画面になります。
ルーティング
次にHTTPリクエストがどのようにさばかれるかを見るために、ルーティングの設定を見てみます。
こちらが、./app/router.js
Nodalでは、module.exports = (function() { /*...*/ }) () というIIFE型のモジュールパターンが標準なようです。exportに一貫性を持たせてわかりやすくするためだとか。ふーん。
ここでは、MiddlewareとRenderwareがコントローラに追加されています。
実行フローとしてはこんな感じ。
これはDjangoのルーティングスタイルに習っているのだとか。
コントローラ
indexルートにアクセスした時、何が起こるのかは、./app/controllers/index_controller.jsを見てね。とのこと。
indexルートにアクセスするち、IndexControllerのインスタンスが新しく作られるらしい。
メソッド内にthis.paramsというものがあるけど、これはクライアントからのリクエストパラメータを内部に含むらしい。あと、this.appとすることで、アプリケーションのグローバルなプロパティにアクセスできるとか。
そして、getメソッドは、HTTPのGETリクエストがコントローラにたどり着いたときに呼ばれるらしい。ルート周りで利用可能なメソッドは以下のとおり。
あるいはCRUD風に書いてもOK。
コントローラ内部から文字列をレンダーするには、this.render()を使う。なんかReactっぽい??JSONもレンダーできるらしい。その他の利用可能なレスポンドについてはAPIドキュメントを参考とのこと。
コントローラ内でthisの仕様
ES6のアロー関数はthisのための新しいコンテキストを生成しないらしい。匿名のアロー関数を使って、コントローラのインスタンスへの参照を保持することがベストプラクティス。self = this; はアンチパターンらしい。
CLIでコントローラ生成
CLIでコントローラを作ります。まずはTopページのためのコントローラを作成します。
$ nodal g:controller Top
これで.controllers/にコントローラが作成されます。
パスの指定もOKらしい。
$ nodal g:controller path/to/conrollerName
作成されたコントローラがこちら。
モデル
モデルの作成はカンタンだそうです。プロジェクトにモデルは必須ではありませんが、以下のようにしてモデルを作成できます。
今回は英単語を格納するwordというモデルを作成します。
$ nodal g:model Words
生成されたモデルファイルがこちら。
ちなみに、コントローラの作成はroutingの追記も行ってくれますし、モデルの作成はマイグレーションの作成も行ってくれます。
ちなみに、Nodalは現在PostgreSQLしかサポートしていません。エッジが効いてますね。
スキーマは、サーバの起動時にschema.jsonを自動的にロードするNodal.my.schemaからセットされるようです。そのため、スキーマへの変更はアプリケーションのシャット・ダウンとリロードが必要です。
特別なモデル
Nodalには2つの特別なモデルが既に用意されています。UserとAccessTokenです。Userは使いたかったので非常にありがたいです。
まあ、両方作っておきます。
$ nodal g:model --user
モデルのマイグレート
モデルとともに、マイグレーションが生成されています。モデルデータをスキーマにロードするために、データベースに関するコマンドを打ちます。
$ nodal db:create
その結果、以下のエラーが。
あれ??ひょっとしてPostgresが起動してない??
対応しました。↓
Postgresを起動した結果、以下のとおりDBが作成できました。
次に、マイグレーションに備えて準備をします。
$ nodal db:prepare
そして最後に、マイグレーションを実行します。
$ nodal db:migrate
ちなみに、マイグレーションを取り消したい場合は、
$ nodal db:rollback
とすれば良いようです。
まとめ
というわけで、今回はここまで。
Node.jsの新興フレームワーク、Nodalを使ってWebアプリケーションを作成する準備を整えました。