node-v0.6.18からエラー表示がわかりやすくなります。
今まである程度 Node.js を使ったことがある方は、以下のエラーメッセージを1度や2度目にしたことがあるのではないでしょうか。
node.js:201 throw e; // process.nextTick error, or 'error' event on first tick
これは以前の記事 Node.js のエラーメッセージの謎 でも解説しましたが、私がよく見るのは存在しないスクリプトファイルを指定して Node を起動した時に現れるエラーとしてです。その他、
// error.js if(true) { throw new Error('hoge'); }
などスクリプトやモジュール内でエラーを throw した時にも、
$ node ~/error.js node.js:249 throw e; // process.nextTick error, or 'error' event on first tick ^ Error: hoge at Object.<anonymous> (/home/ohtsu/error.js:3:9) at Module._compile (module.js:444:26) at Object..js (module.js:462:10) at Module.load (module.js:351:32) at Function._load (module.js:309:12) at module.js:482:10 at EventEmitter._tickCallback (node.js:238:11)
と、表示されるエラーです。当然 process.nextTick() 内でエラーを throw しても同じエラーが出ます。
これを最初見た時には、
「 process.nextTick() なんて使ってないのになんでぇ?」
と驚いたものです。(これが process.nextTick()を解りにくくしている一因かもしれません。このスクリプトやモジュールの読み込みでなぜ process.nextTick() エラーが出るかは、先の記事を参照して下さい。)
実はこれまで process.nextTick() 内で発生するエラーは、どこのコードで発生しようと全てこのメッセージを固定的に表示していました。
やっぱり見てもあまり意味のないエラーメッセージに皆さんうんざりしてたんでしょうね(私もそうですが)、ちょうど今朝このエラー表示を改善するパッチが node-v0.6 系で適応されました。
Pull Request #3238: Improve Exception reporting by felixge · joyent/node
このパッチのおかげで次にリリースされる node-v0.6.18 からは、
$ ./node ~/error.js /home/ohtsu/error.js:3 throw new Error('hoge'); ^ Error: hoge at Object.<anonymous> (/home/ohtsu/error.js:3:9) at Module._compile (module.js:446:26) at Object..js (module.js:464:10) at Module.load (module.js:353:31) at Function._load (module.js:311:12) at Array.0 (module.js:484:10) at EventEmitter._tickCallback (node.js:190:38)
というように、ちゃんとエラーを throw したソースの行番号とスニペットまでが表示されるようになります。
次出る Node では、もう process.nextTick の固定文字エラーを見なくても大丈夫ですので、今後はしっかりエラーを見ましょう。
蛇足
で、存在しないスクリプトで node を立ち上げたエラーの方はこんな風になります。node 内部のソースコードが変数付きで表示されててなんかちょっとイケてないですよね。このようなネイティブモジュールから出るエラーはソース表示はしなくていいんじゃない?ってパッチを作って先の PR で議論したところです。(setTimeout() 内のエラーも同様でして、今後どうなるでしょうか?)
> ./node hoge.js module.js:337 throw new Error("Cannot find module '" + request + "'"); ^ Error: Cannot find module '/home/ohtsu/tmp/github/node/hoge.js' at Function._resolveFilename (module.js:337:11) at Function._load (module.js:279:25) at Array.0 (module.js:484:10) at EventEmitter._tickCallback (node.js:190:38)