2013-05-22 14 views
10

Ich frage mich, wie, um einen absoluten Pfad eines Aufrufers einer Funktion zu bekommen?Nodejs: get Dateiname der Anruferfunktion

Lassen Sie sagen, dass:

in Datei a.js Ich nenne b(); b() ist eine in der Datei b.js definierte Funktion. a.js erfordert b. Also, wie bekomme ich a.js absoluten Pfad von b.js in Knoten?

+1

Siehe auch http://stackoverflow.com/questions/13227489/how-can-one-get-the- file-path-of-the-caller-funktion-in-node-js –

+0

Und siehe auch http://stackoverflow.com/questions/10111163/in-node-js-how-can-i-get-the-path -of-a-modul-ich-habe-geladen-via-require-that-is – basilikum

+0

Siehe meine Antwort [hier] (https://stackoverflow.com/a/44872310/52499). –

Antwort

16

Dies ist ein Beispiel, wie Stacktrace verwenden Anrufer-Datei zu finden in Knoten

function _getCallerFile() { 
    try { 
     var err = new Error(); 
     var callerfile; 
     var currentfile; 

     Error.prepareStackTrace = function (err, stack) { return stack; }; 

     currentfile = err.stack.shift().getFileName(); 

     while (err.stack.length) { 
      callerfile = err.stack.shift().getFileName(); 

      if(currentfile !== callerfile) return callerfile; 
     } 
    } catch (err) {} 
    return undefined; 
} 
+0

Dies sollte die akzeptierte Antwort sein: http://StackOverflow.com/A/29581862/11236 – ripper234

1

Ein StackTrace in JavaScript zu bekommen ist ziemlich schwierig. Die beste Methode, die ich gefunden habe ist, einen Fehler zu werfen, fangen Sie es ab, holen Sie den Stapel von Error.getStack() (nicht in allen Browsern implementiert, dh IE.) Und formatieren Sie die Ausgabe.

Jeder Stapelrahmen enthält einen Dateipfad, eine Zeilennummer und einen Funktionsnamen. Webkit unterstützt sogar Argumente, aber das hat noch nicht funktioniert, als ich das letzte Mal überprüft habe.

Dann gibt es das Problem der Code-Verfolgung über verschiedene Ereignisse.

Ich schrieb tatsächlich einen Blog-Post über diese: http://fritsvancampen.wordpress.com/2013/03/28/error-handling-in-javascript-a-better-way/

+0

versuchen { werfen neue Error(); } catch (e) { Konsole.log (JSON.Stringify (e)); } funktioniert nicht auf Nodejs – einstein

+0

Sie können nicht JSON native Objekte kodieren. Warum würdest du das überhaupt wollen? : S – Halcyon

1

Sie können require.resolve(module) verwenden Sie den vollständigen Pfad eines Moduls zu bestimmen:

var path = require.resolve("a"); 

//or 

var path = require.resolve("./a.js"); 
+0

der Anrufer ist nicht immer im Voraus festgelegt, also: dieser Weg wird nicht funktionieren –

3

beantworten nicht genau die Frage hier aber einige vielleicht dieses informat schätzen Ion.

Mit NodeJS & immer (-Monitor), folgendes enthält einen Dateinamen, von dem der Prozess gestartet wurde:

process.mainModule.filename 

Haben nicht viele Anwendungen ™ obwohl versucht.

Dies scheint eine ziemlich anständige Erklärung zu sein: .

+0

Definitiv beantwortet die Frage nicht, aber dies half mir.Vielen Dank! – shriek

17

Fehler beim Wiederherstellen der prepareStackTrace-Funktion. Hier ist ein Beispiel, das Nebenwirkungen

function _getCallerFile() { 
    var originalFunc = Error.prepareStackTrace; 

    var callerfile; 
    try { 
     var err = new Error(); 
     var currentfile; 

     Error.prepareStackTrace = function (err, stack) { return stack; }; 

     currentfile = err.stack.shift().getFileName(); 

     while (err.stack.length) { 
      callerfile = err.stack.shift().getFileName(); 

      if(currentfile !== callerfile) break; 
     } 
    } catch (e) {} 

    Error.prepareStackTrace = originalFunc; 

    return callerfile; 
} 
+0

Großartig! Ich habe versucht, ein Problem damit stundenlang zu lösen. Die Neuzuweisung der ursprünglichen Funktion hat alles repariert. –