2012年2月4日土曜日

Node.jsをUbuntu 11.10にセットアップする ついでにExpress.jsもセットアップする その2

Express.jsのインストールもうまくいき、$ expressでテンプレートもできあがったので満足していたら実はまだ問題があったようで下記コマンドを実行したらエラーがもりもりと出てきてしまった。

$ node app.js

エラー内容はこちら。
node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
TypeError: Cannot read property 'prototype' of undefined
    at Object. (/home/yoo/matsuo-software/sandbox/node-firstapp/node_modules/express/lib/express/server.js:87:44)
    at Module._compile (module.js:444:26)
    at Object..js (module.js:462:10)
    at Module.load (module.js:351:31)
    at Function._load (module.js:310:12)
    at Module.require (module.js:357:17)
    at require (module.js:373:17)
    at Object. (/home/yoo/matsuo-software/sandbox/node-firstapp/node_modules/express/lib/express/index.js:28:31)
    at Module._compile (module.js:444:26)
    at Object..js (module.js:462:10)

することなすことすべてがエラーで返ってくるので常に心を整えていないとやっていられない。エラー場所として示されているserver.jsの87行目を見てみると

Server.prototype.__proto__ = connect.Server.prototype;

となっている。で、GoogleしてみるとExpress.jsに対応したConnect.jsのバージョンがどうやらインストールされていないらしい。インストールしているExpress.jsのバージョンは1.0.7で、そのバージョンのExpress.jsが対応しているConnect.jsは0.5.10らしい。しかしnpmからインストールするとConnect.jsは1.0.1がインストールされてしまうためにエラーとなっているようだ。なので下記コマンドで古いConnect.jsをインストールする。

$ npm install connect@0.5.10

これで冒頭のNode.jsのコマンドを実行するとサーバがリッスン状態に突入するので、http://localhost:3000にアクセスしてHello Worldの出力が正常にされているのを確認できた。ちなみに自分の環境にどのモジュールのどのバージョンがインストールされているかを調べるコマンドは下記。

$ npm ls

表示されるモジュールの一覧で、Connect.jsのバージョンが0.5.10になっているのが確認できると思う。

Node.jsをUbuntu 11.10にセットアップする ついでにExpress.jsもセットアップする

Node.jsを使ってみたかったのでUbuntu 11.10にセットアップしたときのメモ書き。Node.jsのセットアップ自体はさっくりと終わり何事もなかったのだけれども、後述する諸々の事情からExpress.jsのインストールに失敗してしまい、完了するまでやたらと時間がかかったので後続の方のためにも記しておく。

下記の一連のコマンドを実行してもらいたい。

1, Gitから最新のNode.jsコードを取得する
$ sudo apt-get update
$ sudo apt-get install git-core curl build-essential openssl libssl-dev
$ git clone https://github.com/joyent/node.git && cd node
Node.jsでSSLを使う場合はopensslが必要なのでついでにインストールしておく。上記のコマンドでnodeフォルダに最新のNode.jsコードがクローンされた。

2, コンパイルしてインストールする
$ ./configure
$ make
$ sudo make install
$ node -v
正常にインストールがされたら一番最後のコマンドのnode -vでインストールされたNode.jsのバージョンが表示されていると思う。ちなみに今日(2012/2/2)現在で0.7.2-preとなっている。

3, NPM(Node Package Manager)をインストールする。NPMはNode.jsまわりで必要になるモジュールを簡単にインストールできるとても便利なツールだ
$ curl http://npmjs.org/install.sh | sudo sh
$ npm -v
こちらも今日現在で1.1.0-3となっている。($ npm searchでnpmでインストールできるモジュールの一覧が参照できるので興味がある人は見てみると良いだろう)

ここまででNode.jsのセットアップが整ったのでExpress.jsのセットアップにとりかかる。
4, Express.jsをインストールする
$ npm install -g express
-gはグローバルにインストールするオプションだ。グローバル指定だと/usr/local/bin/あたりにインストールされる。ローカルにだけインストールしたいのなら-gははずそう。ローカル指定にすると現在のディレクトリ直下のnode_modulesにインストールされる。

5, 忘れずにExpress.jsに必要なモジュールもインストールする
$ npm install -d

これでExpress.jsのインストールが完了したはずなのでExpress.jsを実行してみよう。
6, Express.jsを実行してテンプレートを作成する
$ express

すると高確率で意味不明なエラーに遭遇すると思う。しなかったら今回のポストの表題の件は達成したのでアリーベデルチしていただいて結構だ。

エラーは「process.nextTick error, or 'error' event on first tick」という感じのまったく要領を得ない内容で取り付く島がない。で、色々とGoogle & 試行錯誤の結果、どうやらテンプレートエンジンであるJade.jsというのがインストールされていないらしい。

7, なのでJade.jsをインストールする
$ npm install -g jade

するとまたエラーになる。エラー内容によるとJade.jsと依存関係にあるCommander.jsがNode.jsの0.7未満までにしか対応しておらず、gitから調子こいて最新のNode.jsをインストールしたばっかりにインストールがうまくいっていないようだ(これが冒頭で述べた諸々の事情)。この時点であまりのうまくいかなさに少し常軌を逸しかけたけれども、幸いかな、優秀な開発者の方々のおかげで簡単にNode.jsのバージョンを変更する手段がすでに用意されていた。ありがとう優秀なみなさん。

8, Node.jsのバージョンを変更するためにnをインストールして、Node.jsのバージョンを0.6.9に変更する
$ npm install -g n
$ sudo n 0.6.9
$ node -v
これでNode.jsが0.6.9になったので、再度7を実行しJade.jsをインストールする。Jade.jsのインストールが成功したら再度6を実行してみよう。ディレクトリの指定がないけどここにつくっていいの?的なことを尋ねられるので yes とタイプすると、直下にviewsとかtestとかのディレクトリをもりもりと作ってくれるはずだ。

以上でNode.jsとExpress.jsのセットアップの解説は終わりだ。偉そうに解説しておいてなんだけれども、Node.jsは今から開発しようとしている人間なのでNode.jsまわりの知識はほぼゼロに近い、かつLinuxも触り始めたばかりのため疎く間違った解説があるかもしれない。また今回は色々なコマンドを試しながらセットアップしたので正しくない解説 & 不要なコマンドもあるかもしれないが、少しでもセットアップに行き詰った方の一助になれば幸いだ。

今回のセットアップがやたらと大変だったのは、Express.jsの依存関係としてあがってくるconnectとqsのインストールに失敗しているものだとばかり考えていたので、そちらと格闘するのに大幅な時間がとられてしまったせいだと思う。ただJade.jsに目をつけてからは、インストールできない→nのインストール→バージョン変更→Jade.jsのインストール成功→Express.jsの実行成功、ととんとん拍子に進んだので最後のほうは楽だった。これで週末はNode.jsとmongoDBの評価がさっくりとできそうでなによりだ。ふぃ~