Node.js 用パッケージマネージャ npm と Sinatra ライク軽量フレームワークの express を使ってみた

おばんです。昨日は node.js のセットアップで終わってしまいましたが、今日は Hello, world までやってみます。


謝辞

今回エントリするにあたって以下の記事を参考にさせていただきました。ありがとうございます。


npm のセットアップ

Node.js には rpm によく似たパッケージ管理を実現する npm というものが存在します。他に同様のもので kiwi というものも存在するのですが、今後は npm を使うことが推薦されているようです。以下 kiwi の公式サイトより引用。

NOTE: kiwi is no longer supported, please use npm. This repository will remain for educational purposes only

まずは npm がないとライブラリの導入もままならないのでまっさきにインストールしてみます。セットアップに先立って、ホームディレクトリに設定ファイルを記述します。

$ vim ~/.npmrc
root = ~/.npm/libraries
binroot = ~/.npm/bin
manroot = ~/.npm/man

設定ファイルを記述したら次は環境変数を設定します。bash の場合は .bashrc に以下の内容を記述しておけばログイン時に自動的に設定されるようになります。

export NODE_PATH=~/.npm/libraries:$NODE_PATH
export PATH=~/.npm/bin:$PATH
export MANPATH=~/.npm/man:$MANPATH

source コマンドを使って今しがた設定した環境変数をロードします。(もしくは再ログインでも OK)

$ source .bashrc

設定が終わったら以下のコマンドで npm 本体をインストールします。

$ curl http://npmjs.org/install.sh | sh
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100   661  100   661    0     0    594      0  0:00:01  0:00:01 --:--:--     0
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100  2531  100  2531    0     0   1889      0  0:00:01  0:00:01 --:--:--  9271
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100  576k  100  576k    0     0   188k      0  0:00:03  0:00:03 --:--:--  226k
node cli.js cache clean
npm info it worked if it ends with ok
npm info using npm@0.2.4-1
npm ok
node cli.js rm npm
npm info it worked if it ends with ok
npm info using npm@0.2.4-1
npm info not installed npm
npm ok
node cli.js install npm
npm info it worked if it ends with ok
npm info using npm@0.2.4-1
npm info fetch http://registry.npmjs.org/npm/-/npm-0.2.4-1.tgz
npm info install npm@0.2.4-1
npm info preinstall npm@0.2.4-1
npm WARN bins installing to /home/seiya/.npm/bin, outside PATH
npm WARN npm@0.2.4-1 linkMans It seems /home/seiya/.npm/man might not be visible to man
npm WARN npm@0.2.4-1 linkMans For greater justice, please add it to your man path
npm WARN npm@0.2.4-1 linkMans See: `man man`
npm info install npm@0.2.4-1
npm info postinstall npm@0.2.4-1
npm info activate npm@0.2.4-1
npm info preactivate npm@0.2.4-1
npm info activate npm@0.2.4-1
npm info postactivate npm@0.2.4-1
npm info build Success: npm@0.2.4-1
npm ok
It worked

正常にインストールが出来ていれば npm コマンドが ~/.npm/bin/ 下に生成されます。

$ npm --version
0.2.4-1

ぐれーと。


express をセットアップする

Node.js には HTTP サーバを実現するライブラリがバンドルされているのですが、プリミティブなものなのでここではフレームワークを使ってみることにします。今回は Sinatra ライクに簡潔にルーティングが出来る express というフレームワークを使ってみます。早速 npm を使ってインストールしてみましょう。

$ npm install express
npm info it worked if it ends with ok
npm info using npm@0.2.4-1
npm info fetch http://registry.npmjs.org/express/-/express@1.0.0rc4.tgz
npm info fetch http://registry.npmjs.org/connect/-/connect-0.2.7.tgz
npm info install express@1.0.0rc4
npm info install connect@0.2.7
npm info preinstall express@1.0.0rc4
npm info preinstall connect@0.2.7
npm WARN bins installing to /home/seiya/.npm/bin, outside PATH
npm info install express@1.0.0rc4
npm info postinstall express@1.0.0rc4
npm info activate express@1.0.0rc4
npm info preactivate express@1.0.0rc4
npm info activate express@1.0.0rc4
npm info postactivate express@1.0.0rc4
npm info install connect@0.2.7
npm info postinstall connect@0.2.7
npm info activate connect@0.2.7
npm info preactivate connect@0.2.7
npm info activate connect@0.2.7
npm info postactivate connect@0.2.7
npm info build Success: express@1.0.0rc4
npm info build Success: connect@0.2.7
npm ok

つつがなくインストールが終わってしまいました。公式サイトのサンプルに則って適当にコードを書いてみます。ファイル名は server.js とします。

var app = require("express").createServer();

app.get("/", function(req, res) {
	res.send("Hello, world!");
	console.log([req, res]);
});

app.listen(8080);

node コマンドで実行してみます。

$ node server.js

これだけでコマンドが中断されるまで listen し続けるサーバの出来上がりです。早速ブラウザから 8080 ポートにアクセスしてみるとまばゆいばかりの Hello, world! をお目にかかることが出来ました。console.log() の内容は node の標準出力に表示されるようです。ちょっと長いですが req, res の内容を貼りつけてみました。

$ node server.js
[ { socket:
     { fd: 7
     , type: 'tcp4'
     , secure: false
     , _readWatcher: [Object]
     , readable: true
     , _writeQueue: []
     , _writeQueueEncoding: []
     , _writeQueueFD: []
     , _writeWatcher: [Object]
     , writable: true
     , _writeImpl: [Function]
     , _readImpl: [Function]
     , _shutdownImpl: [Function]
     , remoteAddress: '110.4.189.82'
     , remotePort: 55368
     , server: [Object]
     , _outgoing: []
     , __destroyOnDrain: false
     , ondrain: [Function]
     , _idleTimeout: 120000
     , _idleNext: [Object]
     , _idlePrev: [Circular]
     , _idleStart: Sat, 23 Oct 2010 16:38:26 GMT
     , _events: [Object]
     , ondata: [Function]
     , onend: [Function]
     , _onOutgoingSent: [Function]
     }
  , connection: [Circular]
  , httpVersion: '1.1'
  , headers:
     { host: 'rd-sandbox-2.aws.uniba.jp:8080'
     , connection: 'keep-alive'
     , 'cache-control': 'max-age=0'
     , accept: 'application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'
     , 'user-agent': 'Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.41 Safari/534.7'
     , 'accept-encoding': 'gzip,deflate,sdch'
     , 'accept-language': 'ja,en-US;q=0.8,en;q=0.6'
     , 'accept-charset': 'Shift_JIS,utf-8;q=0.7,*;q=0.3'
     , cookie: '__utmz=258608462.1286871711.6.2.utmcsr=rd.uniba.jp|utmccn=(referral)|utmcmd=referral|utmcct=/blog/; __utma=258608462.1333207560.1282819752.1287049453.1287724320.9'
     }
  , url: '/'
  , method: 'GET'
  , statusCode: null
  , client: [Circular]
  , httpVersionMajor: 1
  , httpVersionMinor: 1
  , upgrade: false
  , originalUrl: '/'
  , query: {}
  , app: [Circular]
  , res:
     { socket: [Circular]
     , connection: [Circular]
     , output: []
     , outputEncodings: []
     , _last: false
     , chunkedEncoding: false
     , shouldKeepAlive: true
     , useChunkedEncodingByDefault: true
     , _hasBody: true
     , finished: true
     , writeHead: [Function]
     , headers: [Object]
     , app: [Circular]
     , req: [Circular]
     , _header: 'HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length: 13\r\nDate: Sat, 23 Oct 2010 16:38:26 GMT\r\nX-Response-Time: 0ms\r\nX-Powered-By: Connect 0.2.7\r\nServer: Node v0.2.3\r\nConnection: keep-alive\r\n\r\n'
     , _headerSent: true
     }
  , next: [Function: next]
  , params: []
  }
, [Circular]
]

うーん素晴らしい!あとは O/R Mapper があれば簡単な Web アプリケーションが作れそうですね。今回はチュートリアルみたいな感じになってしまいましたが、どんどん高度なことにチャレンジしていきたいですね。それではまた!

preload preload preload