Node.js: 如何从模块中获取需要函数的文件名?
Node.js: How to get filename where function was required from within a module?
我正在尝试从需要模块功能的地方获取原始文件名。我知道你可以使用 __filename
来获取当前文件,但我想获取原始文件。
例如我有一个简单的模块
module.js
module.exports(function() {
return {
print : function(message) {
console.log(__filename + ' ' + message);
};
}
});
app.js
var module = require('./module')();
module.print('hello');
最终会打印 module.js hello
但我真的很想看到 app.js hello
.
我正在探索获取它的方法,我知道您可以使用 console.trace
查看调用堆栈,但我无法解析它来执行我想要的操作。
现在我已经通过让 print
函数接受另一个参数来解决这个问题,你只需从 app.js
中传递 __filename
但我有点想找到一个我不必这样做的解决方案。
您可以使用 require.resolve(moduleName)
获取文件的完整路径。 path.basename
可以剥离父目录。所以在你的例子中:
var path = require("path");
var module = require('./module')();
process.stdout.write(path.basename(require.resolve('./module') + " ");
module.print('hello');
获取父模块
您可以像这样使用 module.parent
, then resolving the filename
属性 来做到这一点:
module.js
module.exports(function() {
return {
print : function(message) {
console.log(module.parent.filename + ' ' + message);
};
}
});
app.js
var module = require('./module')();
module.print('hello');
输出:
/path/to/app.js hello
这几乎就是您要的。
验证解决方案
此解决方案为您提供完全限定的路径,但您通过使用分隔符拆分路径来获取文件名。
var parentModFilename = module.parent.filename.split(/\|\//).pop()
这会在 parentModFilename
中给你 "/app.js"
。
我正在尝试从需要模块功能的地方获取原始文件名。我知道你可以使用 __filename
来获取当前文件,但我想获取原始文件。
例如我有一个简单的模块
module.js
module.exports(function() {
return {
print : function(message) {
console.log(__filename + ' ' + message);
};
}
});
app.js
var module = require('./module')();
module.print('hello');
最终会打印 module.js hello
但我真的很想看到 app.js hello
.
我正在探索获取它的方法,我知道您可以使用 console.trace
查看调用堆栈,但我无法解析它来执行我想要的操作。
现在我已经通过让 print
函数接受另一个参数来解决这个问题,你只需从 app.js
中传递 __filename
但我有点想找到一个我不必这样做的解决方案。
您可以使用 require.resolve(moduleName)
获取文件的完整路径。 path.basename
可以剥离父目录。所以在你的例子中:
var path = require("path");
var module = require('./module')();
process.stdout.write(path.basename(require.resolve('./module') + " ");
module.print('hello');
获取父模块
您可以像这样使用 module.parent
, then resolving the filename
属性 来做到这一点:
module.js
module.exports(function() {
return {
print : function(message) {
console.log(module.parent.filename + ' ' + message);
};
}
});
app.js
var module = require('./module')();
module.print('hello');
输出:
/path/to/app.js hello
这几乎就是您要的。
验证解决方案
此解决方案为您提供完全限定的路径,但您通过使用分隔符拆分路径来获取文件名。
var parentModFilename = module.parent.filename.split(/\|\//).pop()
这会在 parentModFilename
中给你 "/app.js"
。