の内部の仕組みをいじる必要がありv8
ます。参照: JavaScript Stack Trace API に関する wiki エントリ。
提案されたコミットのいくつかのコードに基づいて少しテストしましたが、うまくいくようです。絶対パスになってしまいます。
// omfg.js
module.exports = omfg
function omfg() {
var caller = getCaller()
console.log(caller.filename)
}
// private
function getCaller() {
var stack = getStack()
// Remove superfluous function calls on stack
stack.shift() // getCaller --> getStack
stack.shift() // omfg --> getCaller
// Return caller's caller
return stack[1].receiver
}
function getStack() {
// Save original Error.prepareStackTrace
var origPrepareStackTrace = Error.prepareStackTrace
// Override with function that just returns `stack`
Error.prepareStackTrace = function (_, stack) {
return stack
}
// Create a new `Error`, which automatically gets `stack`
var err = new Error()
// Evaluate `err.stack`, which calls our new `Error.prepareStackTrace`
var stack = err.stack
// Restore original `Error.prepareStackTrace`
Error.prepareStackTrace = origPrepareStackTrace
// Remove superfluous function call on stack
stack.shift() // getStack --> Error
return stack
}
omfg
モジュールを含むテスト:
#!/usr/bin/env node
// test.js
var omfg = require("./omfg")
omfg()
そして、コンソールに の絶対パスが表示されtest.js
ます。
説明
これは「v8」の問題であるため、「node.js」の問題ではありません。
参照:カスタム例外のスタック トレース コレクション
Error.captureStackTrace(error, constructorOpt)
error
パラメータにプロパティを追加しますstack
。このプロパティは、デフォルトでString
( を介してFormatStackTrace
) に評価されます。Error.prepareStackTrace(error, structuredStackTrace)
が の場合Function
、 の代わりに呼び出されFormatStackTrace
ます。
Error.prepareStackTrace
したがって、必要なもの (この場合はパラメーターのみ) を返す独自の関数でオーバーライドできますstructuredStackTrace
。
次に、structuredStackTrace[1].receiver
呼び出し元を表すオブジェクトです。