なっく日報

技術やら生活やらのメモ

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のおかげで無事解決できました。

非同期処理時に発生したエラーでお困りの際にはぜひお試しあれ。

なお、ドキュメントに記載されてますが、パフォーマンスが劣化するので、本番環境ではカジュアルには使わぬように。