Node.js:如何在模块中获取需要函数的文件名?

aug*_*aug 2 console module require node.js

我正在尝试从需要模块功能的地方获取原始文件名.我知道你可以使用__filename获取当前文件,但我想获取原始文件.

例如,我将拥有一个简单的模块

module.js

module.exports(function() {
   return {
     print : function(message) {
        console.log(__filename + ' ' + message);
     };
   }
});
Run Code Online (Sandbox Code Playgroud)

app.js

var module = require('./module')();
module.print('hello');
Run Code Online (Sandbox Code Playgroud)

最终会发生什么,它会打印,module.js hello但我真的很想看app.js hello.

我正在探索获得它的方法,我知道你可以用它console.trace来查看堆栈的调用,但我不能解析它来做我想要的.

现在我已经通过使print函数接受另一个参数并且你只是__filename从内部传递来解决它,app.js但我想找到一个我不必这样做的解决方案.

Swi*_*vel 5

获得父模块

你可以通过使用module.parent,然后filename像这样解析属性来做到这一点:

module.js

module.exports(function() {
   return {
     print : function(message) {
        console.log(module.parent.filename + ' ' + message);
     };
   }
});
Run Code Online (Sandbox Code Playgroud)

app.js

var module = require('./module')();
module.print('hello');
Run Code Online (Sandbox Code Playgroud)

输出:

/path/to/app.js hello
Run Code Online (Sandbox Code Playgroud)

这几乎就是你所要求的.

资格解决方案

此解决方案为您提供了一个完全限定的路径,但您可以通过分隔符分隔路径来获取文件名.

var parentModFilename = module.parent.filename.split(/\\|\//).pop()
Run Code Online (Sandbox Code Playgroud)

然后会给你"/app.js"parentModFilename.

  • 请注意,“module.parent”将为您提供*第一个*需要“module.js”的模块,因此如果另一个模块在“app.js”之前需要“module.js”,您将获得该模块的名称,而不是“应用程序.js`。另外 `module.parent` 现在已[弃用](https://nodejs.org/api/modules.html#moduleparent)。 (2认同)