Node.jsでスタックトレースを出力する方法
Node.jsでスタックトレースを出力する方法
console.trace()
は、現在のコールスタック全体を出力する最も簡単な方法です。
function foo() {
bar();
}
function bar() {
console.trace();
}
foo();
このコードを実行すると、次のような出力が出力されます。
ReferenceError: bar is not defined
at foo (/path/to/file.js:5:3)
at Object.<anonymous> (/path/to/file.js:10:1)
Error
オブジェクトは、スタックトレースを含むエラー情報を生成するために使用できます。
function foo() {
bar();
}
function bar() {
throw new Error('エラーが発生しました');
}
try {
foo();
} catch (err) {
console.log(err.stack);
}
Error: エラーが発生しました
at bar (/path/to/file.js:5:3)
at foo (/path/to/file.js:10:1)
at Object.<anonymous> (/path/to/file.js:15:1)
デバッガーを使う
Node.jsには、Chrome DevToolsなどのデバッガーが付属しています。デバッガーを使用すると、スタックトレースを含む実行中のコードをステップ実行できます。
ライブラリを使う
debug
やwinston
などのライブラリを使用して、スタックトレースをより詳細に出力することができます。
これらの方法のいずれを使用しても、Node.jsで発生したエラーの原因を特定することができます。
その他のヒント
- スタックトレースをファイルに保存したい場合は、
fs.writeFile()
などのファイルシステム API を使用できます。 - スタックトレースをフォーマットしたい場合は、
stacktrace-parser
などのライブラリを使用できます。
Node.jsでスタックトレースを出力するには、いくつかの方法があります。これらの方法のいずれを使用しても、Node.jsで発生したエラーの原因を特定することができます。
console.trace()を使う
function foo() {
bar();
}
function bar() {
console.trace();
}
foo();
ReferenceError: bar is not defined
at foo (/path/to/file.js:5:3)
at Object.<anonymous> (/path/to/file.js:10:1)
Errorオブジェクトを使う
function foo() {
bar();
}
function bar() {
throw new Error('エラーが発生しました');
}
try {
foo();
} catch (err) {
console.log(err.stack);
}
出力例:
Error: エラーが発生しました
at bar (/path/to/file.js:5:3)
at foo (/path/to/file.js:10:1)
at Object.<anonymous> (/path/to/file.js:15:1)
デバッガーを使う
- Node.jsでコードを実行します。
- Chrome DevToolsなどのデバッガーを開きます。
- ブレークポイントを設定します。
- スタックトレースパネルを開きます。
ライブラリを使う
debug
ライブラリを使う例:
const debug = require('debug')('my-app');
function foo() {
bar();
}
function bar() {
debug('エラーが発生しました');
throw new Error('エラーが発生しました');
}
try {
foo();
} catch (err) {
console.log(err.stack);
}
[my-app] エラーが発生しました
Error: エラーが発生しました
at bar (/path/to/file.js:5:3)
at foo (/path/to/file.js:10:1)
at Object.<anonymous> (/path/to/file.js:15:1)
Node.jsでスタックトレースを出力するその他の方法
process.on('uncaughtException')
イベントは、処理されない例外が発生したときに発生します。このイベントリスナーを使用して、スタックトレースを含むエラー情報を取得できます。
process.on('uncaughtException', (err) => {
console.log(err.stack);
});
function foo() {
bar();
}
function bar() {
throw new Error('エラーが発生しました');
}
foo();
Error: エラーが発生しました
at bar (/path/to/file.js:5:3)
at foo (/path/to/file.js:10:1)
at Object.<anonymous> (/path/to/file.js:15:1)
async_hooks
モジュールは、非同期操作の開始と終了を追跡するために使用できます。このモジュールを使用して、非同期操作で発生したエラーのスタックトレースを取得できます。
const asyncHooks = require('async_hooks');
const hook = asyncHooks.createHook({
init(asyncId, type, triggerAsyncId, resource) {
// 何か処理
},
before(asyncId, type, triggerAsyncId, resource) {
// 何か処理
},
after(asyncId, type, triggerAsyncId, resource) {
// 何か処理
},
destroy(asyncId) {
// 何か処理
},
});
hook.enable();
function foo() {
bar();
}
function bar() {
setTimeout(() => {
throw new Error('エラーが発生しました');
}, 1000);
}
foo();
Error: エラーが発生しました
at bar (/path/to/file.js:5:3)
at foo (/path/to/file.js:10:1)
at Object.<anonymous> (/path/to/file.js:15:1)
source-map
モジュールは、ソースコードと圧縮されたコード間のマッピング情報を生成するために使用できます。このモジュールを使用して、圧縮されたコードで発生したエラーのスタックトレースを元のソースコードに変換できます。
const sourceMap = require('source-map');
sourceMap.loadSourceMap('path/to/source-map.json').then((map) => {
const originalStack = map.getOriginalError(err);
console.log(originalStack);
});
function foo() {
bar();
}
function bar() {
throw new Error('エラーが発生しました');
}
foo();
Error: エラーが発生しました
at bar (/path/to/file.js:5:3)
at foo (/path/to/file.js:10:1)
at Object.<anonymous> (/path/to/file.js:15:1)
- 簡単な方法でスタックトレースを出力したい場合は、
console.trace()
を使用します。 - より詳細な情報を取得したい場合は、
Error
オブジェクトを使用します。 - 非同期操作で発生したエラーのスタックトレースを取得したい場合は、
async_hooks
モジュールを使用します。 - 圧縮されたコードで発生したエラーのスタックトレースを元のソースコードに変換したい場合は、
source-map
モジュールを使用します。
javascript node.js stack-trace