【问题标题】:Node.js: How to get filename where function was required from within a module?Node.js:如何从模块中获取需要函数的文件名?
【发布时间】:2015-04-25 09:47:36
【问题描述】:

我正在尝试从需要模块功能的地方获取原始文件名。我知道你可以使用__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,但我有点想找到一个我不需要的解决方案这样做。

【问题讨论】:

  • 以及将其传递给模块有什么问题,如var module = require('./module')(__filename);
  • 没什么问题,就是想知道有没有可能。如果不可能,那也是一个完全可以的答案。
  • @aug 我的回答解决了你的难题吗?
  • @Swivel 嘿,感谢您的跟进!哇,确实如此!对不起,我从来没有见过 :) 接受

标签: node.js module console require


【解决方案1】:

获取父模块

您可以通过使用 module.parent 来做到这一点,然后像这样解析 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()

这会给你"/app.js" in parentModFilename

【讨论】:

    【解决方案2】:

    您可以使用require.resolve(moduleName) 获取文件的完整路径。 path.basename 可以剥离父目录。所以在你的例子中:

    var path = require("path");
    var module = require('./module')();
    process.stdout.write(path.basename(require.resolve('./module') + " ");
    module.print('hello');
    

    【讨论】:

      猜你喜欢
      • 2018-08-10
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 2015-11-19
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      相关资源
      最近更新 更多