はじめてのNode.js覚え書き①

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);	
	...
}

記述の仕方がことなるだけで、内容は変わらないと思うのですが、何が違うか不明です。。。