如何找出函数中的模块path
我有这样的代码:
A.js
module.exports = function() { /* Here I need to find out the path of module in which this function was called. */ };
B.js
var A = require('./A.js'); A();
C.js
var A = require('./A.js'); A();
是否有可能找出模块A的哪个文件函数被调用? 我知道我可以传递__filename参数:
var A = require('./A.js'); A(__filename);
但也许有另一种方式没有传递给A()的任何参数?
那么,这是可能的,但你真的不应该这样做。 您可以检查错误堆栈以获取调用文件path,如下所示:
function getCallingFile(n) { // Regular expression used to extract the file path var exp = / \(([^:]+)(:[^\)]+)?\)$/; // Extract line from error stack var line = new Error().stack.split('\n')[1 + n]; // Try to find path in that line var m = exp.exec(line); if(m) { return m[1]; } else { return null; } }
参数n
意味着应该跳过多less级别的堆栈,在你的例子中它应该是1。
你为什么不这样做? 因为
-
err.stack
的确切格式尚未正式指定, - 如果你从本地代码调用它,这个函数将失败,
- 这不是什么错误堆栈devise和
- 它强制执行一个特定的目录,如果你重构了你的代码,这个目录可能会导致问题。
如果我正确理解你的问题,那么答案是否定的。在Javascript中的一个函数并不知道在规范中logging的任何标准方式的调用者的文件名。 有一些使用exception堆栈跟踪的黑客,但不build议使用它的原因各种各样。
你不解释你为什么要这么做,但是一般来说,函数不应该根据调用者是谁来改变它的行为。 相反,函数应该根据传递给它的参数来定义一个行为。 如果你想从B.js和C.js中调用不同的行为,那么你应该在每个情况下指定一些参数来指示行为应该是什么,或者创build不同的函数来调用它们来产生不同的行为。