2013-05-22 25 views
10

Zastanawiam się, jak uzyskać bezwzględną ścieżkę dzwoniącego funkcji?Nodejs: pobierz nazwę funkcji dzwoniącego

powiedzmy, że:

w pliku a.js nazywam b(); b() to funkcja zdefiniowana w pliku b.js. a.js wymaga b. Więc jak uzyskać a.js absolutna ścieżka od b.js w węźle?

+1

Zobacz również http://stackoverflow.com/questions/13227489/how-can-one-get-the- file-path-of-the-caller-function-in-node-js –

+0

Zobacz także http://stackoverflow.com/questions/10111163/in-node-js-how-can-i-get-the-path -of-a-module-i-have-loaded-via-require-that-is – basilikum

+0

Zobacz moją odpowiedź [tutaj] (https://stackoverflow.com/a/44872310/52499). –

Odpowiedz

16

To jest przykład jak używać StackTrace znaleźć plik dzwoniącego w węźle

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

Powinna to być zaakceptowana odpowiedź: http://stackoverflow.com/a/29581862/11236 – ripper234

1

Założenie stosu w JavaScript jest dość trudne. Najlepszą metodą, jaką znalazłem, jest zgłoszenie błędu, złapanie go, pobranie stosu z Error.getStack() (nie zaimplementowany we wszystkich przeglądarkach, co oznacza, że ​​IE.) I sformatowanie danych wyjściowych.

Każda ramka stosu podaje ścieżkę do pliku, numer linii i nazwę funkcji. Webkit obsługuje nawet argumenty, ale to nie działało jeszcze, kiedy ostatnio sprawdzałem.

Następnym problemem jest śledzenie kodu w różnych zdarzeniach.

I rzeczywiście napisał na blogu o tym: http://fritsvancampen.wordpress.com/2013/03/28/error-handling-in-javascript-a-better-way/

+0

spróbuj { wyślij nowy błąd(); } catch (e) { console.log (JSON.stringify (e)); } } nie działa na nodejs – einstein

+0

Nie można kodować macierzystych obiektów JSON. Dlaczego miałbyś chcieć to zrobić? : S – Halcyon

1

Można użyć require.resolve(module) określić pełną ścieżkę modułu:

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

//or 

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

dzwoniący nie zawsze jest z góry ustalony, więc: ta metoda nie zadziała –

3

Niezupełnie odpowiadając na pytanie o ale niektórzy mogą docenić ten iNFORMAT jon.

Z NodeJS & zawsze (-monitor) dodaje zawiera nazwę pliku, z którego proces został rozpoczęty:

process.mainModule.filename 

nie próbowałem wiele zastosowań ™ chociaż.

Wydaje się to całkiem przyzwoite wyjaśnienie: https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi.

+0

Zdecydowanie nie odpowiada na pytanie, ale to pomogło mi.Dzięki! – shriek

17

Niepowodzenie przywrócenia funkcji prepareStackTrace może powodować problemy. Oto przykład, który usuwa skutki uboczne

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

Świetnie! Próbowałem rozwiązać problem związany z tym przez wiele godzin. Ponowne przypisanie oryginalnej funkcji naprawiło wszystko. –