はじめての 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

別の端末から

$ curl http://localhost:8080

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のデフォルトまんまで、全てのアクセスを受け入れているので、よろしくない。