express使おうとしら、Error: Cannot find module 'express'

こういうのは、UNIX系のOSを扱い慣れてれば、
それほど悩まなくてもいいのかもしれないけど、
慣れてないので書いておく。
Macだけど。

    • OS:Mac OS X 10.6.7
    • node.js 0.4.7
    • express 2.3.7


node.jsの設置は以下を参考に:

http://sakuratan.biz/archives/3101
naveでNode.jsのバージョン管理&イベントループ詳説 (1/3):node.jsでサーバサイドJavaScript開発入門(2) - @IT

エラーにたどり着くまでの手順をざっと。


1. ターミナルを起動。


2. 一般ユーザーのホームディレクトリ下に設置するので、
インストールディレクトリを作成、移動。

$ mkdir nodejs
$ cd nodejs


3. naveをインストール。

$ git clone http://github.com/isaacs/nave.git

~/nodejs/nave
が作成される。


naveを使うと、node.jsの更新、バージョンの切り替えが楽、とか。


4. 最新版のnode.jsをインストール。

$ cd nave
$ ./nave.sh install latest

結構時間がかかった。


5. node.jsを使えるようにする。

$ ./nave.sh use latest


6. バージョンを確認。

$ node -v
v0.4.7

と表示された。


7. 続けて、npmをインストール。

$ curl http://npmjs.org/install.sh | sh

途中で、

Is this OK? enter 'yes' or 'no'

と問われるので、「yes」と入力。


8. サーバー用のディレクトリを作って、example.jsを設置する。

$ cd ~
$ mkdir node_server
$ cd node_server

「node_server」ディレクトリ内にexample.jsを設置。


example.jsの中身は上の参考サイトを参照:

http://sakuratan.biz/archives/3101


9. example.jsを動かしてみる。

$ node example.js

パスが通ってないので動きません。
(node command not found)


10. .bash_profileにパスを記述して、node.jsのパスを通す。

$ cd ~
vi .bash_profile

以下を記述。

# node.js
NODE_PATH=~/.nave/installed/0.4.7/bin
export NODE_PATH

node.jsの本体の位置を、
「NODE_PATH=」以下に記述。


参考:

Setting up Node.js and npm on Mac OSX | George Ornbo


11. パスの記述を有効化。

$ source .bash_profile


12. 再度、example.jsを動かす。

$ cd ~/node_server
$ node example.js

ブラウザで、
http://127.0.0.1:8124
にアクセスしてみると、

Hello, World

と表示された。


続いてexample2.jsもやってみてうまくいった(詳細は割愛)。


13. 続いてserver.jsをやってみるので、expressをインストール。

$ cd ~/nodejs/nave
$ npm install experss

以下が表示された。

mime@1.2.2 ./node_modules/express/node_modules/mime
connect@1.4.1 ./node_modules/express/node_modules/connect
qs@0.1.0 ./node_modules/express/node_modules/qs
express@2.3.7 ./node_modules/express

14. server.jsを実行してみる。

$ cd ~/node_server
$ node server.js

で、タイトルのエラーにたどりつく。

node.js:134
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: Cannot find module 'express'
at Function._resolveFilename (module.js:320:11)
at Function._load (module.js:266:25)
at require (module.js:348:19)
at Object. (/Users/(ユーザー名)/node_server/server.js:2:15)
at Module._compile (module.js:404:26)
at Object..js (module.js:410:10)
at Module.load (module.js:336:31)
at Function._load (module.js:297:12)
at Array. (module.js:423:10)
at EventEmitter._tickCallback (node.js:126:26)

expressがどこにあるかわかんねーよ、
と言われてるんで、
どこにあるか教えてあげないと動いてくれない。


ここで疑問に思ったのが、

    • expressはどこに入ってるのか?
    • node.jsはどこにあるものを見つけてくれるのか?

というあたり。


2点目については、

$ node -e require.paths

で確認できる。


参考:

Gmane Loom


1点目については、
expressのインストール時に、

express@2.3.7 ./node_modules/express

と出たのを頭の片隅に置いておく。


手順10の、node.js本体の位置を環境設定のところであっさり通り過ぎましたが、
ホームディレクトリ直下には、いつの間にやら、

.nave
.npm

というディレクトリができていた。
node.jsは.naveの下だったので、
.npmの下をさがすと、

~/.npm/express/2.3.7/package/bin

にexpressがあったので、これを.bash_profileに指定してみたけど動かず。


で、2点目の、

$ node -e require.paths

をやってみると、

[ '/Users/(ユーザー名)/.nave/installed/0.4.7/bin',
'/Users/(ユーザー名)/.node_modules',
'/Users/(ユーザー名)/.node_libraries']

と表示。
1行目は、手順10で追加したもの。
2行目、3行目は実在していない。
expressの位置はわからんよね、というのがよくわかった。


ディレクトリ構成とか、コマンドの実行位置とか、よくわからず...。


いろいろと調べて、node.jsのマニュアルのモジュールの最後のところをよく読む。

http://nodejs.jp/nodejs.org_ja/api/modules.html

「Addenda: Package Manager Tips」のところ。


で、また探してみると、

~/nodejs/nave/node_module

にexpressがあったので、
.bash_profileを以下のように編集。

# node.js
NODE_PATH=~/.nave/installed/0.4.7/bin

#express
NODE_PATH=$NODE_PATH:~/nodejs/nave/node_modules

export NODE_PATH

有効化。

$ source .bash_export

で、server.jsがやっと動いた。


そしてその後、node.jsを0.4.8に更新し、

$ node -e require.paths

をやってみると、

[ '/Users/(ユーザー名)/.nave/installed/0.4.8/lib/node',
'/Users/(ユーザー名)/.node_modules',
'/Users/(ユーザー名)/.node_libraries',
'/Users/(ユーザー名)/.nave/installed/0.4.8/lib/node' ]

と出た。うーん。


.bash_profileの中身が書き換えられたわけではないので、

$ source .bash_profile
$ node -e require.paths

で、

[ '/Users/(ユーザー名)/.nave/installed/0.4.7/bin',
'/Users/(ユーザー名)/nodejs/nave/node_modules',
'/Users/(ユーザー名)/.node_modules',
'/Users/(ユーザー名)/.node_libraries',
'/Users/(ユーザー名)/.nave/installed/0.4.8/lib/node' ]

となった。


~/.node_modules
を作って、そこにnpmでモジュールがインストールされるようにしとけばよさげなんだけど、
とりあえずディレクトリは作っておく。
ディレクトリがあれば、その場所にモジュールをインストールしてくれる、
とかだといいけど。。。
あとでほかのモジュールをいれるので、そのときにまた確認。

追記

id:koichikさんのコメントを参考に、mongooseをローカルインストールしてみようとする、
が、またいろいろと壁が。。。


15. nodeのパスをもう1度。


まず、

$ cd ~/nodejs/nave
$ npm install mongoose

で、

bash: npm: command not found

となる。


この時点で、node.jsを0.4.8にしたので、
npmはバージョンごとにインストールしなければいかのか、
と思った、のはただの勘。


npmを再インストールしようと、

$ cd ~/nodejs/nave/
$ curl http://npmjs.org/install.sh | sh
(以下が表示)
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 101 3874 101 3874 0 0 4893 0 --:--:-- --:--:-- --:--:-- 1101 3874 101 3874 0 0 4892 0 --:--:-- --:--:-- --:--:-- 11164
npm cannot be installed without nodejs.
Install node first, and then try again.

Maybe node is installed, but not in the PATH?
Note that running as sudo can change envs.

PATH=(云云...)


nodeコマンドが認識されないし。。。
「PATH=」の部分に0.4.8のパスはなし。


で、また、.bash_profileを編集。
NODE_PATHではなくて、PATHで指定。

PATH=$PATH:~/.nave/installed/0.4.8/bin
export PATH


で、動くようになった。


16. 「node_server」ディレクトリ以下に、「node_modules」ディレクトリ作成。

$ cd ~/node_server
$ mkdir node_modules


17. npmをnode.js 0.4.8用にインストール。
npmのインストール先は、

~/.nave/installed/0.4.7/lib/node_modules

だった。。。


参考:
http://pekodeco.jimdo.com/2011/02/23/ubuntu-%E3%81%A7-node-js-%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E6%89%8B%E9%A0%86/


今回はホームディレクトリ直下で。

$ cd ~
$ curl http://npmjs.org/install.sh | sh


あとは手順7と同じ。


18. mongooseをインストール。

$ cd ~/node_server
$ npm install mongoose
(以下が表示)
mongoose@1.3.7 ./node_modules/mongoose
└── hooks@0.1.6


~/node_server/node_modules/
に「mongoose」ディレクトリが作成された。