当它在nodejs中的不同文件中时,如何获取调用方法的dirname?

时间:2013-08-09 10:44:10

标签: node.js

假设我有两个文件dir/a.jslib/b.js

a.js:

b = require('../lib/b');
b.someFn();

b.js:

var fallback = "./config.json";
module.exports = {
  someFn = function(jsonFile) {
    console.log(require(jsonFile || fallback);
  }
}

此示例中b.js的全部目的是读取json文件,因此我可以将其称为b.someFn("path/to/file.json")

但是我希望有一个默认值,比如配置文件。但默认值应该是相对于 a.js 而不是 b.js 。换句话说,我应该可以从b.someFn()拨打a.js,它应该说,“既然你没有通过我的路径,我会假设默认路径config.json “。但是默认值应该相对于a.js,即dir/config.json lib/config.json,如果我require(jsonFile),我会得到。< / p>

我可以获得cwd,但这只有在dir/内启动脚本时才有效。

b.js是否有任何方法可以在someFn()内说“给我__dirname调用我的函数?”

3 个答案:

答案 0 :(得分:30)

使用callsite,然后:

b.js:

var path = require('path'),
    callsite = require('callsite');

module.exports = {
  someFn: function () {
    var stack = callsite(),
        requester = stack[1].getFileName();

    console.log(path.dirname(requester));
  }
};

答案 1 :(得分:0)

或者,使用enter image description here

const path = require('path');
const parentModule = require('parent-module');

// get caller of current script
console.log(path.dirname(parentModule()));
// get caller of module, change './index.js' to your "main" script
console.log(path.dirname(parentModule(require.resolve('./index.js'))));

答案 2 :(得分:-1)

如果你想得到调用函数脚本的目录,那么就像上面的答案所示使用stacktrace,否则,硬编码a.js目录的问题是什么?

var fallback = "dir_a/config.json";
module.exports = {
  someFn = function(jsonFile) {
    console.log(require(jsonFile || fallback);
  }
}