はじめての Node.js
ちょっと作ってみたいものが出来たので、Node.jsの使い方を勉強中。
(本当はWebSocketを使ってごにょごにょしたい)
使用した環境
Debian GNU/Linux 7.1 (Wheezy)
インストール
Debian公式のdebパッケージは基本的にバージョンアップされないので、Node.jsのように更新速度が速いものは、別の手法で管理したほうが良い。(そもそも、nodejsパッケージはsidにしかない。。)
Node.jsの管理ツールとしてはいくつかあるようだけれど、検索して色々情報が出てきたnvm(Node Version Manager)というものを使ってインストール。他には、naveとかnodebrewとか色々あるみたい。
$ curl https://raw.github.com/creationix/nvm/master/install.sh | sh
環境変数PATHの設定もしてくれたらしいので、ターミナルを再起動
とりあえず、現在の安定版の最新をインストール
$ nvm install v0.10.16
hello world
Node界隈ではhello worldとしてHelloを返すHTTPサーバーを実装するものらしいので、動かしてみる。
hello.jsという名前で、下記コードを記述。
var http = require('http');
var server = http.createServer();
server.on('request', function(request, response) {
console.log(request.url);
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('hello ' + request.url);
});
server.listen(8080, 'localhost');
nodeコマンドで実行。
$ node hello.js
別の端末から
hello /
はOK。
じゃあ、IP直打ちでもいけるかなーと思ったけど、下記はダメ。
$ curl http://(サーバーのIPアドレス):8080
curl: (7) couldn't connect to host
iptablesでブロックしているわけでもなし。。*1
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
そもそも、127.0.0.1(localhost)でしかlistenしてないぞ。。
$ netstat -ant | grep 8080
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN
あれこれ悩んだ結果、hello.jsの最後の一行を下記に書き換えることで、意図した通りに動いた。
- server.listen(8080, 'localhost');
+ server.listen(8080, 'IPアドレス');
もしくは、ホスト名を指定しなければ、localhostでも、IPアドレス直打ちでも動作する。
- server.listen(8080, 'localhost');
+ server.listen(8080);
第三引数 hostname はオプションなので、必ずしも指定する必要は無かった。
ちゃんとリファレンスを読みましょう。というオチ。
http://nodejs.org/api/http.html#http_server_listen_port_hostname_backlog_callback
参考文献
松島浩道「はじめての Node.js -サーバーサイドJavaScriptでWebアプリを開発する-」ソフトバンククリエイティブ
*1:この設定はWheezyのデフォルトまんまで、全てのアクセスを受け入れているので、よろしくない。