Boost」など、さまざまなカンファレンスを企画・運営しています。BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。14:00JavaScriptポスト最近話題の新言語『CoffeeScript』をとりあげた連載「CoffeeScriptによるモダンなWebアプリケーション開発」。連載第3回からはベストプラクティス編として、CoffeeScriptでNode.jsアプリケーションを開発する際によく使われる実用的な開発手法を4回に分けて紹介しています。CoffeeScriptの歴史や概要については過去の連載も参照ください。4Webアプリケーションの開発インストールファイル構成クエリストリングを受け取るPOSTデータを受け取る静的ファイルその他のメソッドテンプレートエンジンEcoテンプレートの書式レスポンスを圧縮する静的ファイルをブラウザにキャッシュさせる独自のエラーページを用意する開発用のエラーページNode.jsのモジュールシステムNode.jsはCommonJS(注1)をベースとしたモジュールの仕組みを採用しており、require()で他のモジュールをロードできるようになっています。この仕組みのおかげでアプリケーションを複数のファイルに分割して管理でき、全体の見通しをよくすることができます。このrequire()の仕組みはブラウザではサポートされていません。注1:CommonJSブラウザ以外でのJavaScriptを取り巻く仕様を決めるためのプロジェクト。モジュール仕様はその一部。Node.jsのモジュールシステムはCommonJSの一部であるモジュール仕様をベースとして作られた。Node.jsとブラウザの両方に対応したライブラリを作るNode.jsとブラウザのどちらにも対応したライブラリを作る時は、Node.jsではrequire()で、ブラウザでは<script>タグで読み込めるよう、[リスト1]のように記述しておきます。ブラウザでは関数の内側にないthisはグローバルオブジェクトのwindowを指すため、thisのプロパティに代入すると他のスクリプトから参照できるようになります。MyLibraryまた、RequireJSで使われているAMDというモジュール定義方式に対応するには[リスト2]のように記述します。src="mylib.js"></script>exportsとmodule.exportsの違い他のモジュールから利用できるようにプロパティや関数などをエクスポートするにはexportsというオブジェクトに追加すればよいですが、代わりにmodule.exportsに追加してエクスポートすることもできます。このexportsとmodule.exportsは何が違うのでしょうか?exportsとmodule.exportsは、それ自身に代入が可能かという点が異なります。exportsオブジェクトに追加したプロパティは正しくエクスポートされますが、exports自体を上書きしてしまうと何もエクスポートされません。何もエクスポートされない一方、module.exportsに値を代入すると問題なくエクスポートされ、代入した値がrequire()の戻り値となります。エクスポートする関数をまとめて指定したい場合や、require()の戻り値としてオブジェクト以外の値を返したい場合などにmodule.exportsに代入する方法を使います。exportsの代わりにmodule.exportsを常に使っても問題ありません。2myfunc一方、exportsのプロパティとして代入する場合にはmodule.exportsと記述する必要はありません。リスト4はmodule.exportsを使わずにリスト7のように記述できます。"myfunc"URLからコンテンツを取得するNode.jsの標準APIを使ってURLからコンテンツを取得するにはリスト8のように少し面倒なコードを書く必要があります。#{res.statusCode}"Requestというモジュール(Apacheライセンス2.0)を使うと、より短いコードでコンテンツを取得できます。Requestをインストールするには、プロジェクトのディレクトリで次のコマンドを実行します。requestRequestを使うと、リスト8と同様の単純なGETリクエストをリスト9のように記述することができます。#{response.statusCode}"request()の第1引数でURLなどのパラメータを指定します。ここでqsにオブジェクトを指定すると、URLの?以降のクエリストリングをオブジェクトで指定することができます。456これはhttp://localhost/path?abc=123&def=456へのリクエストとなります。POSTリクエストの場合はリスト10のようにrequest.post()メソッドを使用します。formパラメータをオブジェクトで指定すると、HTMLでフォームを送信した場合のようにname1=value1&name2=value2の形式でPOSTデータが送信されます。charset=utf-8となります。->このリクエストで送信されるPOSTデータは以下のようになります。abc=123&def=456また、jsonパラメータをオブジェクトで指定した場合、JSON文字列に変換されてPOSTデータが送信されます。リクエストのContent-Typeは自動的にapplication/jsonとなります。->このリクエストで送信されるPOSTデータは以下のようになります。{"abc":123,"def":456}その他、任意のPOSTデータを送信するにはbodyパラメータで文字列を指定します。->バイナリデータなどを送信する場合にはBufferオブジェクトをbodyパラメータに指定することができます。->バイナリデータの受け取りレスポンスはデフォルトでUTF-8として解釈された文字列となりますが、Bufferオブジェクトで受け取りたい場合はencodingパラメータにnullを指定します。#{response.statusCode}"タイムアウトリクエストにタイムアウトを設定するにはtimeoutをミリ秒で指定します。タイムアウトが発生した場合、コールバックのerr引数に値が入ります。ナオ)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メディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。イラストの無断転載を禁じます。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。