假设我有两个文件dir/a.js
和lib/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
调用我的函数?”
答案 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)
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);
}
}