Boost」など、さまざまなカンファレンスを企画・運営しています。BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。4Webアプリケーションの開発インストールファイル構成クエリストリングを受け取るPOSTデータを受け取る静的ファイルその他のメソッドテンプレートエンジンEcoテンプレートの書式レスポンスを圧縮する静的ファイルをブラウザにキャッシュさせる独自のエラーページを用意する開発用のエラーページWebアプリケーションの開発Webアプリケーションを開発する時、すべてを一から開発するのは大変です。幸いなことにNode.jsにはExpress(MITライセンス)というWebフレームワークがあり、これを土台として楽にWebアプリケーションを開発できます。3.0に基づいています。Expressを使うと、たった5行のソースコードで最小限のWebサーバを作ることができます(リスト18)。3.0をインストールするには、プロジェクトのディレクトリに移動して次のコマンドを実行します。express@3.0また、後ほど使うEcoとConsolidate.js(MITライセンス)というモジュールもインストールしておきます。consolidateファイル構成ディレクトリやファイルの構成は自由に作ることができますが、以下に参考例を挙げます。Makefile:ビルド用のファイルREADME:アプリケーションの説明config/:環境設定ファイルを置くsrc/:CoffeeScriptなどのソースコードを置くlib/:コンパイルしたJavaScriptを置く(本番環境などで使用)public/:静的ファイルを置くtest/:テストコードを置くviews/:HTMLなどのテンプレートを置くlog/:ログファイルの出力先config/config.coffeeには環境設定ファイルを置きます。開発環境と本番環境とをすぐに切り替えられるよう、環境設定などを記述しておきます。設定ファイルとしてまとめておくことで、プログラムに埋め込んでおくよりも編集しやすくなります。ファイル内容の参考例をリスト19に示します。データベースのパスワードなどを書いた場合、誤って公開してしまうことがないように気をつけてください。'dbpassword'Webサーバのメインプログラムをsrc/app.coffeeとし、リスト20の内容で作成します。started."そして、viewsディレクトリにindex.ecoというファイルを置きます(リスト21)。World!</p></body></html>ここまでできたらターミナルからsrc/app.coffeeを起動してみましょう。started.上記のようにメッセージが出ればサーバの起動は成功です。World!」と表示されます。これでExpressを使ったアプリケーションの基礎部分ができました。あとは必要に応じてコンテンツを追加していきましょう。src/app.coffeeを変更した時は、上記のコマンドを一旦停止して再実行すると反映されます。クエリストリングを受け取るGETでクエリストリングを受け取るには、ルーティングとしてリスト22のように記述します。パラメータとして受け取る箇所を「:パラメータ名」で指定します。レスポンスが完了したことを示すこのように定義しておくと、ユーザーがブラウザから/blog/tech/coffeescript-guideというパスにアクセスした場合、req.params.categoryの値がtech、req.params.slugの値がcoffeescript-guideとなります。POSTデータを受け取るPOSTデータを受け取るにはリスト23のように記述します。express.bodyParser()を実行しているため、POSTされたデータは自動的にオブジェクトに変換されてreq.bodyのプロパティとしてアクセスできるようになります。abc=123&def=456というデータを送るとreq.body.abcに123が、req.body.defに456がセットされます。application/jsonが含まれる場合はJSONとして解釈され、POSTデータとして{"abc":"123","def":"456"}という文字列を送るとreq.body.abcが123、req.body.defが456という値になります。静的ファイルpublicディレクトリに置いたファイルはすべて静的ファイルとしてブラウザからアクセスできます。public/favicon.icoに置いたファイルはhttp://ホスト/favicon.icoというURLでアクセスできます。その他のメソッドExpressで使えるその他のメソッドはAPIドキュメント(英語)を参照してください。テンプレートエンジンEcoExpressでは好みのテンプレートエンジンを選んで使うことができますが、本稿ではCoffeeScriptと相性の良いEco(MITライセンス)というテンプレートエンジンを使います。Ecoのテンプレートはviewsディレクトリ内に置きます。拡張子は.ecoを使います。app/src.coffeeの中でres.render()の第1引数にテンプレート名を指定します。第2引数にオブジェクトを指定するとそのプロパティをテンプレート内で@プロパティ名で参照できるようになります(リスト24、25)。%></span></div>出力されるHTMLは次のようになります。src/app.coffeeの変更を反映するにはコマンドを一旦止めて再実行します。'index'と記述することもできます。テンプレートの書式Ecoのテンプレートで使える書式は次の通りです。任意のCoffeeScriptを実行できます。%>式を評価し、その値をエスケープして出力します。%>式を評価し、その値をエスケープせずに出力します。%>render()の第2引数で渡されたオブジェクトのプロパティを出力します。%>render()の第2引数で渡されたオブジェクトのhelperメソッドを呼び、その戻り値をエスケープして出力します。%>render()の第2引数で渡されたオブジェクトのhelperメソッドを呼びます。helperが実行される際、第1引数にキャプチャ関数が渡されます。そのキャプチャ関数を実行すると、...に該当する部分のコンテンツを戻り値として受け取ることができます。<%%<%という文字を出力します。%>CoffeeScriptのプログラムと同じようにif-elseによる条件分岐で該当する部分のコンテンツを出力します。%>までのコンテンツを繰り返し出力します。レスポンスを圧縮するレスポンスをgzipやdeflateで圧縮する場合は、compressというミドルウェアを使います。compressを使うには、app.configure()部分のexpress.static()の直前に次の行を追加します。この設定をすると、リクエストヘッダのAccept-Encodingにgzipやdeflateが含まれている場合にコンテンツを圧縮して転送します。express.compress()静的ファイルをブラウザにキャッシュさせる一般的に画像などの静的ファイルの更新頻度は低いため、ブラウザ側でキャッシュさせるようにするとネットワークの使用量を節約できます。静的ファイルをブラウザ側でキャッシュさせるには、express.static()を呼ぶ時にmaxAgeオプションを指定します。前述のcompressや他のミドルウェアと組み合わせると、app.configure()内は次のようなコードになります。cons.ecoなお、このようにしてブラウザにキャッシュさせたコンテンツの内容を更新したときは、HTMLから読み込むURLを変更すると、ブラウザが新たにコンテンツを取得するようになります。Errorなどのエラーページを独自に用意するには、まずsrc/app.coffeeのファイルの先頭で次のようにNotFoundクラスを定義します。NotFound次に、app.get()などのルーティング定義部分より後で、次のようにミドルウェアを追加しエラーを拾うようにしておきます。使うそして、views/404.ecoとviews/500.ecoにそれぞれHTMLのテンプレートを用意しておきます。最後に、エラーページを表示したい箇所で次のようにエラーオブジェクトを引数にしてnext()を呼びます。その際、app.get()やapp.all()に渡すコールバック関数にnextという引数を追加します。404エラーをブラウザに返す開発用のエラーページ本番環境用に作られたエラーページではセキュリティやデザイン上の理由で技術的なエラーの詳細を表示しないことが多いため、開発時には不便に感じることがあります。そこで、本番環境では独自のエラーページを表示し、開発環境ではスタックトレースなどの技術的な詳細を含むエラーページを表示するようにしておくと便利です。環境ごとに異なるエラーページを表示するには、エラーページ表示用のミドルウェア部分を次のように書き換えます。'500'このようにすると、src/app.coffeeを普通に起動した場合はdevelopment(開発環境)の方が実行されて標準のエラーページがスタックトレースとともに表示されます(例:図3)。環境変数NODE_ENVにproductionという値をセットして起動した場合はproduction(本番環境)の方が実行されて独自のエラーページが表示されます(リスト26)。標準のエラーページ次回も引き続き、CoffeeScriptでNode.jsアプリケーションを開発する際によく使われる実用的な開発手法を紹介します。ナオ)1984年東京都生まれ。高校時代に趣味でPerlやJavaを使ってプログラミングを始める。ニュースサイトの開発などを担当。その後、面白法人カヤックにてソーシャルゲームの開発などを手がける。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。12:00法務担当者、6割超が今後業務で「生成AIを使用したい」と回答。NEW新着記事一覧を見るイベント今後の予定を見るCodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。イラストの無断転載を禁じます。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。