longjohnで非同期処理時に発生したエラーを追う
本日、同僚からよくわからんエラーがあるので、ちょっと見て欲しいと言われ、その際に使ったテクニックの共有を。
なお、エラーが発生していたのはNode.jsで書かれたコードです。
使ったモノ
コレ github.com
同様のライブラリとして、 https://github.com/tlrobinson/long-stack-traces とかもありますが、longjohnの方がメンテされている模様。
例
long-stack-tracesのサイトに記述されている例ですが、
どっちのsetTimeoutが先に呼ばれるでしょうか?
longjohnがないとき〜
'use strict'; function f() { throw new Error('foo'); } setTimeout(f, Math.random() * 1000); setTimeout(f, Math.random() * 1000);
実行結果
/private/tmp/hoge.js:5 throw new Error('foo'); ^ Error: foo at f [as _onTimeout] (/private/tmp/hoge.js:5:9) at Timer.listOnTimeout (timers.js:92:15)
これではわからない
longjohnがあるとき〜
npm i longjohn
して
'use strict'; require('longjohn'); function f() { throw new Error('foo'); } setTimeout(f, Math.random() * 1000); setTimeout(f, Math.random() * 1000);
実行結果
/private/tmp/hoge.js:5 throw new Error('foo'); ^ Error: foo at [object Object].f (/private/tmp/hoge.js:5:11) at Timer.listOnTimeout (timers.js:92:15) --------------------------------------------- at Object.<anonymous> (/private/tmp/hoge.js:9:1) at Module._compile (module.js:435:26) at Object.Module._extensions..js (module.js:442:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:311:12) at Function.Module.runMain (module.js:467:10) at startup (node.js:136:18) at node.js:963:3
hoge.js:9
なので、下の方の関数で、エラーが発生したとわかります。
まとめ
冒頭に出てきた同僚が嵌っていたエラーも、longjohnのおかげで無事解決できました。
非同期処理時に発生したエラーでお困りの際にはぜひお試しあれ。
なお、ドキュメントに記載されてますが、パフォーマンスが劣化するので、本番環境ではカジュアルには使わぬように。