28

假设我有两个文件,dir/a.js并且lib/b.js

一个.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()from a.js,并且应该说,“既然你没有给我传递路径,我将假设默认路径为config.json。” 但是默认值应该是相对的a.js,即应该是dir/config.json不是 lib/config.json,如果我这样做了,我会得到require(jsonFile)

我可以得到cwd,但这只有在我从内部启动脚本时才会起作用dir/

有没有办法在b.js里面说someFn(),“给我__dirname调用我的函数?”

4

3 回答 3

36

使用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));
  }
};
于 2013-08-09T11:13:10.697 回答
0

或者,使用parent-module

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'))));
于 2020-04-09T02:40:01.460 回答
-1

如果要获取调用者函数的脚本目录,那么就如上面的答案所示使用stacktrace,否则,硬编码a.js的目录有什么问题?

var fallback = "dir_a/config.json";
module.exports = {
  someFn = function(jsonFile) {
    console.log(require(jsonFile || fallback);
  }
}
于 2013-08-09T12:55:51.820 回答