你需要摆弄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
.
解释
这与其说是“node.js”问题,不如说是“v8”问题。
请参阅:自定义异常的堆栈跟踪集合
Error.captureStackTrace(error, constructorOpt)
向error
参数添加一个stack
属性,默认情况下评估为 a String
(通过FormatStackTrace
)。如果Error.prepareStackTrace(error, structuredStackTrace)
是 a Function
,则调用它而不是FormatStackTrace
。
Error.prepareStackTrace
所以,我们可以用我们自己的函数覆盖,它会返回我们想要的任何东西——在这种情况下,只是structuredStackTrace
参数。
然后,structuredStackTrace[1].receiver
是一个代表调用者的对象。