Node.js: как получить имя файла, в котором требуется функция, из модуля?

Я пытаюсь получить исходное имя файла, откуда требуется функция модуля. Я знаю, что вы можете использовать __filename для получения текущего файла, но я хочу получить исходный файл.

Например, простой модуль, который у меня есть, будет

module.js

module.exports(function() {
   return {
     print : function(message) {
        console.log(__filename + ' ' + message);
     };
   }
});

app.js

var module = require('./module')();
module.print('hello');

В конце концов, он напечатает module.js hello, но я действительно хочу увидеть app.js hello.

Я искал способы получить его, и я знаю, что вы можете использовать console.trace, чтобы увидеть стек вызовов, но я не могу разобрать его, чтобы сделать то, что я хочу.

Прямо сейчас я работал над этим, заставив функцию print принимать другой параметр, и вы просто передаете __filename из app.js, но я как бы хочу найти решение, в котором мне не нужно этого делать.


person aug    schedule 23.02.2015    source источник
comment
И что плохого в том, чтобы передать его в модуль, как в var module = require('./module')(__filename);   -  person adeneo    schedule 24.02.2015
comment
В этом нет ничего плохого, я просто хотел узнать, возможно ли это. Если это невозможно, это тоже вполне нормальный ответ.   -  person aug    schedule 24.02.2015
comment
@aug Мой ответ решил твою дилемму?   -  person Swivel    schedule 19.09.2018
comment
@Swivel эй, спасибо за внимание! Ничего себе! Извините, я этого не видел :) принимаю   -  person aug    schedule 19.09.2018


Ответы (2)


Получение родительского модуля

Вы можете сделать это, используя module.parent , а затем разрешив filename следующим образом:

модуль.js

module.exports(function() {
   return {
     print : function(message) {
        console.log(module.parent.filename + ' ' + message);
     };
   }
});

app.js

var module = require('./module')();
module.print('hello');

Выход:

/path/to/app.js hello

Это почти то, о чем вы просите.

Квалификация решения

Это решение предоставляет вам полный путь, но вы получаете имя файла, разделяя путь по его разделителю.

var parentModFilename = module.parent.filename.split(/\\|\//).pop()

Что тогда даст вам "/app.js" в parentModFilename.

person Swivel    schedule 14.08.2015

Вы можете использовать require.resolve(moduleName), чтобы получить полный путь к файлу. path.basename может удалить родительские каталоги. Итак, в вашем примере:

var path = require("path");
var module = require('./module')();
process.stdout.write(path.basename(require.resolve('./module') + " ");
module.print('hello');
person Peter Lyons    schedule 24.02.2015