ぼちぼち日記

おそらくプロトコルネタを書いていることが多いんじゃないかと思います。

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)