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の中身は上の参考サイトを参照:
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=」以下に記述。
参考:
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
で確認できる。
参考:
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のマニュアルのモジュールの最後のところをよく読む。
「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_modulesexport 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
だった。。。
今回はホームディレクトリ直下で。
$ 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」ディレクトリが作成された。