Javascript 如何找出函数中的模块路径
我有这样的代码: A.js B.js C.js 是否有可能找出调用模块A的哪个文件函数?我知道我可以传递_filename参数: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中的函数不知道其调用方的文件名,这是规范中记录的任何标准方式。有一些黑客使用异常堆栈跟踪,但由于各种原因,不建议使用它 您没有解释为什么要这样做,但通常情况下,函数不应该
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;
}
}