Javascript 如何找出函数中的模块路径

Javascript 如何找出函数中的模块路径,javascript,node.js,function,Javascript,Node.js,Function,我有这样的代码: A.js B.js C.js 是否有可能找出调用模块A的哪个文件函数?我知道我可以传递_filename参数: var A = require('./A.js'); A(__filename); 但是,也许还有另一种方法不向A()传递任何参数?如果我正确理解了您的问题,那么答案是否定的。Javascript中的函数不知道其调用方的文件名,这是规范中记录的任何标准方式。有一些黑客使用异常堆栈跟踪,但由于各种原因,不建议使用它 您没有解释为什么要这样做,但通常情况下,函数不应该

我有这样的代码:

A.js

B.js

C.js

是否有可能找出调用模块A的哪个文件函数?我知道我可以传递_filename参数:

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

A(__filename);

但是,也许还有另一种方法不向A()传递任何参数?

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


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

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

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

你为什么不这样做?因为

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

  • module.parent.filename
    您还可以使用
    require.resolve()我更新了我的帖子,在模块A.js中添加了评论。module.parent.filename-这不是我需要的,因为module.parent始终是调用另一个模块的第一个模块。行为必须相同,但必须知道调用此函数的文件名。我只是想给我的函数传递更少的参数。谢谢你的回答@pavel06081991-如果您正在基于文件名执行某些操作,则行为不同。和往常一样,如果你不把要解决的实际问题保持为一个谜,我们可以提供更好的帮助。你错了:)正如我所说,函数的行为总是一样的。文件名用作对象中的键名。我找到了解决问题的办法。谢谢你的帮助:)@pavel06081991-这可能是函数的一个参数,因为你就是这样使用它的。谢谢!我试试这个。但如果它有效,我为什么不这样做呢?:)@pavel06081991我添加了一个解释,希望能有所帮助。这是唯一的方法,没有其他方法,对吗?@pavel06081991还有其他方法,例如使用
    Error.prepareStackTrace
    访问原始堆栈帧,这些原始堆栈帧不太容易出错,但需要困难的设置并可能导致性能损失。最可靠的解决方案可能是本机绑定,但我从未尝试过。
    var A = require('./A.js');
    
    A();
    
    var A = require('./A.js');
    
    A(__filename);
    
    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;
      }
    }