読者です 読者をやめる 読者になる 読者になる

勉強始めました

日本にいる時からJavaScriptを勉強していたのですが、バタバタしてたのでやめてました。
で、1週間ほどまとめて時間が取れそうなので、node.jsハンズオンでちょっとお勉強。

インストールは終わってるので、まずは1ファイルのダウンロードというのを作っていきます。

var util = require('util'),
	url  = require('url'),
	http = require('http');

function download(urlStr){
	var u = url.parse(urlStr),
		client = http.createClient(u.port || 80, u.hostname),
		request = client.request('GET', 
							u.pathname,
							{ host: u.hostname}
							);
	request.end();

	request.on('response', function(response){
		console.log(response.statusCode);
		for(var i in response.headers){
			console.log("%s : %s", i, response.headers[i]);
		}
		console.log('');
		response.setEncoding('utf8');
		response.on('data', function(chunk){
			util.print(chunk);
		});

		response.on('end', function(){
			console.log('');
		});
	});
}

download(process.argv[2]);

これを実行すると、以下のようにエラーが出てきました。

http.createClient is deprecated. Use `http.request` instead.

どうやらバージョンが変わってdeprecatedになったようです。
Node.jsのAPIを読むと

This function is deprecated; please use http.request() instead. Constructs a new HTTP client. port and host refer to the server to be connected to.

ということで、組み直したのがこちら。

var util = require('util'),
	url  = require('url'),
	http = require('http');

function download(urlStr){
	var u = url.parse(urlStr),
		options = {
			host: u.hostname,
			port: u.port || 80,
			path: u.path,
			method: 'GET'
		};

	var request = http.request(options, function(response){
		console.log(response.statusCode);
		for(var i in response.headers){
			console.log("%s : %s", i, response.headers[i]);
		}
		console.log('');
		response.setEncoding('utf8');
		response.on('data', function(chunk){
			util.print(chunk);
		});

		response.on('end', function(){
			console.log('');
		});
	});
	
	// error handler
	request.on('error', function(e){
		console.log('problem with request '+ e.message);
	});
	request.end();
}

download(process.argv[2]);

まぁ、この実装ならば、http.getを使ったほうがいいですね。ドキュメントにrequest.end()処理が自動的に呼ばれると書いてあるので、こっちのほうが便利。