这是来自三个文件的一些示例代码:
// foo.js var myFunc = require("./myFunc"); function foo(){ myFunc("message"); } // bar.js var myFunc = require("./myFunc"); function bar(){ myFunc("message"); } // myFunc.js module.exports = myFunc; function myFunc(arg1){ console.log(arg1); // Here I need the file path of the caller function // For example, "/path/to/foo.js" and "/path/to/bar.js" }
我需要动态获取调用方函数的文件路径,而无需传递任何额外的参数myFunc。
myFunc
您需要弄弄的内部运作v8。请参阅:有关JavaScript Stack Trace API的Wiki条目。
v8
我已经对提议的提交中的某些代码进行了一些测试,它似乎可以工作。您最终会走上一条绝对之路。
// 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模块的测试:
omfg
#!/usr/bin/env node // test.js var omfg = require("./omfg") omfg()
您将在控制台上找到的绝对路径test.js。
test.js
说明
这不是一个“ node.js”问题,而是一个“ v8”问题。
请参阅:用于自定义异常的堆栈跟踪集合
Error.captureStackTrace(error, constructorOpt)向该error参数添加一个stack属性,该属性默认情况下计算为String(通过FormatStackTrace)。如果Error.prepareStackTrace(error, structuredStackTrace)为Function,则调用而不是FormatStackTrace。
Error.captureStackTrace(error, constructorOpt)
error
stack
String
FormatStackTrace
Error.prepareStackTrace(error, structuredStackTrace)
Function
因此,我们可以Error.prepareStackTrace使用自己的函数覆盖该函数,该函数将返回我们想要的任何东西- 在这种情况下,仅返回structuredStackTrace参数。
Error.prepareStackTrace
structuredStackTrace
然后,structuredStackTrace[1].receiver是一个代表调用者的对象。
structuredStackTrace[1].receiver