如何找出函数中的模块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。

你为什么不这样做? 因为

  1. err.stack的确切格式尚未正式指定,
  2. 如果你从本地代码调用它,这个函数将失败,
  3. 这不是什么错误堆栈devise和
  4. 它强制执行一个特定的目录,如果你重构了你的代码,这个目录可能会导致问题。

如果我正确理解你的问题,那么答案是否定的。在Javascript中的一个函数并不知道在规范中logging的任何标准方式的调用者的文件名。 有一些使用exception堆栈跟踪的黑客,但不build议使用它的原因各种各样。

你不解释你为什么要这么做,但是一般来说,函数不应该根据调用者是谁来改变它的行为。 相反,函数应该根据传递给它的参数来定义一个行为。 如果你想从B.js和C.js中调用不同的行为,那么你应该在每个情况下指定一些参数来指示行为应该是什么,或者创build不同的函数来调用它们来产生不同的行为。