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

假设我有两个文件, 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")

但我希望有一个默认的,就像一个configuration文件。 但是,默认应该是相对于a.js而不是b.js。 换句话说,我应该可以从a.js调用b.someFn() ,并且应该说:“既然你没有传递给我path,我将假设config.json的默认path。 但默认应该是相对于a.js ,即应该是dir/config.json不是 lib/config.json ,如果我确实require(jsonFile) ,我会得到。

我可以得到cwd ,但是这只有在我从dir/启动脚本的时候才有效。

有没有什么办法让b.jssomeFn()里面说:“给我叫函数的__dirname ?”

使用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)); } }; 

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

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