当它在nodejs中的不同文件中时,如何获得调用方法的dirname?
假设我有两个文件, 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")
。
但我希望有一个默认的,就像一个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.js
在someFn()
里面说:“给我叫函数的__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); } }