如何在函数中找出模块路径

时间:2016-01-09 08:20:55

标签: javascript node.js function

我有这样的代码:

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 param:

var A = require('./A.js');

A(__filename);

但也许有另一种方法没有将任何参数传递给A()?

2 个答案:

答案 0 :(得分:1)

如果我理解你的问题,那么答案是否定的.Javascript中的函数不会以规范中记录的任何标准方式知道其调用者的文件名。有一些黑客使用异常堆栈跟踪,但不建议出于各种原因使用它。

您无法解释为什么要尝试这样做,但通常情况下,函数不应根据调用者的身份更改其行为。相反,函数应该具有基于传递给它的参数的已定义行为。如果你想从B.js和C.js调用时有不同的行为,那么你应该在每种情况下调用它时指定一些参数来指示行为应该是什么,或者创建可以被调用以生成不同行为的不同函数

答案 1 :(得分:1)

嗯,这是可能的,但你真的不应该这样做。您可以检查错误堆栈以获取调用文件路径,如下所示:

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表示应跳过多少级别的堆栈,在您的示例中应该为1.

你为什么不这样做?因为

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