はじめてのNode.js覚え書き①
はじめてのNode.js -サーバーサイドJavaScriptでWebアプリを開発する-
- 作者: 松島浩道
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2013/03/15
- メディア: 大型本
- クリック: 15回
- この商品を含むブログ (5件) を見る
dotinstallでnode.jsの勉強はひと通りしたのですが、こちらの本が結構いいみたいなので、購入して勉強をしています。
node.jsの最大の特徴は「ノンブロッキングI/O」と「イベント駆動」という点。
node.jsはシングルスレッドなので、重たい処理をするときに同期処理(returnで値が返ってくるまで待つ)をしてしまうと、他の全ての処理が待ち状態になってしまうので、重たい処理をするときはイベントハンドラー(コールバック)を登録して、処理を実行するメソッド自体はすぐに返ってくるようにし、処理が完了したらイベントハンドラーでその後の処理を行う、とのことです。
今までC#はよく使っていたので、C#でもイベントが用意されているため、イメージはつきました。
例えば、Servierに対してPOSTされた場合に通知して欲しい場合は、下記のようなコードを記述します。
request.on("data", onReceived); function onReceived(chunk) { ... }
C#だと下記のようになるかと思います。
request.data += onReceived; ~~~ void onReceived(object sender, EventArgs e) { ... }
ちなみに、本で一箇所うまくいかない場所がありました。
P97で下記のようなコードがあります。
if(request.method == 'POST') { request.data = ''; request.on('data', function (chunk) { request.data += chunk; }); request.on('end', sendResponse); } ~~~~~~~~ function sendResponse() { var query = querystring.parse(request.data); ... }
sendResponse内でrequestオブジェクトとresponseオブジェクトを使うのですが、引数として定義されていないため、
下記のように変更しました。
if(request.method == 'POST') { request.data = ''; request.on('data', function (chunk) { request.data += chunk; }); // 引数にrequestとresponseを追加。 request.on('end', sendResponse(request, response)); } ~~~~~~~~ // 引数にrequestとresponseを追加。 function sendResponse(request, response) { var query = querystring.parse(request.data); ... }
ただ、上記を実行すると、sendResponse内でrequest.dataの中に何も値が入っていない状態となり、エラーとなってしまいました。
そこで、下記のようにさらに変更したらうまくいきました。
if(request.method == 'POST') { request.data = ''; request.on('data', function (chunk) { request.data += chunk; }); request.on('end', function() { // 一度匿名関数にしてそのなかで実行する。 sendResponse(request, response); }); } ~~~~~~~~ function sendResponse(request, response) { var query = querystring.parse(request.data); ... }
記述の仕方がことなるだけで、内容は変わらないと思うのですが、何が違うか不明です。。。