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のおかげで無事解決できました。
非同期処理時に発生したエラーでお困りの際にはぜひお試しあれ。
なお、ドキュメントに記載されてますが、パフォーマンスが劣化するので、本番環境ではカジュアルには使わぬように。