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"