您需要弄弄的内部运作
v8。请参阅:有关Javascript Stack Trace
API的Wiki条目。
我已经对提议的提交中的某些代码进行了一些测试,它似乎可以工作。您最终会走上一条绝对之路。
// omfg.jsmodule.exports = omfgfunction omfg() { var caller = getCaller() console.log(caller.filename)}// privatefunction 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.jsvar omfg = require("./omfg")omfg()您将在控制台上找到的绝对路径
test.js。
说明
这不是一个“ node.js”问题,而是一个“ v8”问题。
请参阅:用于自定义异常的堆栈跟踪集合
Error.captureStackTrace(error,constructorOpt)向该
error参数添加一个
stack属性,该属性默认情况下计算为
String(通过
FormatStackTrace)。如果
Error.prepareStackTrace(error,structuredStackTrace)为
Function,则调用而不是
FormatStackTrace。
因此,我们可以
Error.prepareStackTrace使用自己的函数覆盖该函数,该函数将返回我们想要的任何东西-
在这种情况下,仅返回
structuredStackTrace参数。
然后,
structuredStackTrace[1].receiver是一个代表调用者的对象。



