Подтвердить что ты не робот

Как получить dirname вызывающего метода, когда он находится в другом файле в nodejs?

Скажем, у меня есть два файла: 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).

Я мог бы получить cwd, но это будет работать, только если я запустил script из dir/.

Есть ли способ b.js сказать, внутри someFn(), "дать мне __dirname вызывающей меня функции?"

4b9b3361

Ответ 1

Используйте 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));
  }
};

Ответ 2

Если вы хотите получить каталог script функции вызывающего абонента, то используйте стек стек, как показывает вышеприведенный ответ, в противном случае проблема hardcoding в каталоге a.js?

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