DRYな備忘録

Don't Repeat Yourself.

Error: Cannot find module 【NODE_PATH】【npm】【Node.js】

【問題】

npm使ってnodeのモジュールをインストールしますよね

% sudo npm install -g argv

こんな感じ。で、こんな感じで呼ぼうとしますよね

app.js

var argv = require('argv');

で、実行すると

% node app.js

module.js:340
    throw err;
          ^
Error: Cannot find module 'argv'

npm install するときに -g してたから呼べると思ってたんだけどなー

【調査】

% which node
/usr/local/bin/node
% which npm
/usr/local/bin/npm
% echo $NODE_PATH
/usr/local/lib/node_modules

別に正しい気がするが…

【原因】

~/.zshrc

NODE_PATH=/usr/local/lib/node_modules
NPM_PATH=/usr/local/bin/npm
export PATH=/usr/local/bin:~/bin:$NPM_PATH:$NODE_PATH:$PATH

 そもそも export PATH=some/path:another/path:any/other/path:$PATH とは、コマンドパスを通すものであって、シェルから使用可能なコマンドのバイナリへのアクセスを可能にするもの。だから、上記のNPM_PATHはPATHにバインドされてしかるべき。これによってシェルで/usr/local/bin/npmと意識して打たなくてもnpmというコマンドとして使えるようになる。

 一方、NODE_PATHは、node的にnode_modulesへのアクセスパスを定義しているだけなので$PATH(コマンドパス)へバインドしても意味ない。$NODE_PATHという名前の環境変数としてexportしてあげないといけない。

【解決】

~/.zshrc

export NODE_PATH=/usr/local/lib/node_modules
NPM_PATH=/usr/local/bin/npm
export PATH=/usr/local/bin:~/bin:$NPM_PATH:$NODE_PATH:$PATH

【雑感】

知らなくて恥ずかしいことが多すぎる。はやく仕事できるマンになりたい。

f:id:otiai10:20130706163327j:plain

英語喋れるようになりたいなー

DRY

はじめてのNode.js -サーバーサイドJavaScriptでWebアプリを開発する-

はじめてのNode.js -サーバーサイドJavaScriptでWebアプリを開発する-