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 свойство като така:

module.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