webentwicklung-frage-antwort-db.com.de

Wie drucke ich einen Stack-Trace in Node.js?

Weiß jemand, wie man eine Stapel-Ablaufverfolgung in Node.js druckt?

470
mike.toString

Jedes Error Objekt hat ein stack Element, das den Punkt abfängt, an dem es erstellt wurde.

var stack = new Error().stack
console.log( stack )

oder einfacher:

console.trace("Here I am!")
556
isaacs

Jetzt gibt es eine dedizierte Funktion auf der Konsole dafür:

console.trace()
181
Mariusz Nowak

Wie bereits beantwortet, können Sie einfach den Befehl trace verwenden:

console.trace("I am here");

Wenn Sie jedoch auf die Frage gekommen sind, wie der Stack-Trace einer Ausnahme protokolliert werden soll , können Sie einfach das Exception-Objekt protokollieren.

try {  
  // if something unexpected
  throw new Error("Something unexpected has occurred.");     

} catch (e) {
  console.error(e);
}

Es wird protokolliert:

Fehler: Es ist etwas Unerwartetes aufgetreten.
At main (c:\Users\Me\Documents\MyApp\app.js: 9: 15)
Bei Objekt. (c:\Users\Me\Documents\MyApp\app.js: 17: 1)
Bei Module._compile (module.js: 460: 26)
Bei Object.Module._extensions..js (module.js: 478: 10)
Bei Module.load (module.js: 355: 32)
Bei Function.Module._load (module.js: 310: 12)
Bei Function.Module.runMain (module.js: 501: 10)
Beim Start (node.js: 129: 16)
Bei node.js: 814: 3


Wenn Ihre Node.js-Version <als 6.0.0 ist, reicht es nicht aus, das Exception-Objekt zu protokollieren. In diesem Fall wird nur Folgendes gedruckt:

[Fehler: Es ist etwas Unerwartetes aufgetreten.]

Verwenden Sie für Node version <6 console.error(e.stack) anstelle von console.error(e), um die Fehlermeldung plus den vollständigen Stapel wie den aktuellen Node Version tut.


Hinweis: Wenn die Ausnahme als Zeichenfolge wie throw "myException" Erstellt wird, können die Stapelablaufverfolgung und nicht abgerufen werden Protokollierung e.stack ergibt undefiniert .

Um sicher zu gehen, können Sie verwenden

console.error(e.stack || e);

und es wird für alte und neue Node.js-Versionen funktionieren.

84
Zanon

So drucken Sie die Stapelspur von Error in der Konsole auf besser lesbare Weise:

console.log(ex, ex.stack.split("\n"));

Beispielergebnis:

[Error] [ 'Error',
  '    at repl:1:7',
  '    at REPLServer.self.eval (repl.js:110:21)',
  '    at Interface.<anonymous> (repl.js:239:12)',
  '    at Interface.EventEmitter.emit (events.js:95:17)',
  '    at Interface._onLine (readline.js:202:10)',
  '    at Interface._line (readline.js:531:8)',
  '    at Interface._ttyWrite (readline.js:760:14)',
  '    at ReadStream.onkeypress (readline.js:99:10)',
  '    at ReadStream.EventEmitter.emit (events.js:98:17)',
  '    at emitKey (readline.js:1095:12)' ]
36
ruX

Mit einem leicht verfügbaren Modul Node ist es möglich, Stack-Traces in voller Länge aus Node zu erhalten (allerdings mit einem geringen Leistungsverlust): http://www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack-traces-for-node-js

9
Tim Boudreau

Versuchen Sie Error.captureStackTrace (targetObject [ constructorOpt]) .

const myObj = {};
function c() {
  // pass
}

function b() {
    Error.captureStackTrace(myObj)
    c()
} 

function a() {
    b()
}

a()

console.log(myObj.stack)

Die Funktionen a und b werden im Fehler-Stack erfasst und in myObj gespeichert.

3
Zheeeng

Da ich weiß, dass das Drucken des vollständigen Stack-Trace in NodeJS nicht möglich ist, können Sie nur einen "teilweisen" Stack-Trace drucken. Sie können nicht sehen, woher Sie im Code gekommen sind, nur wo die Ausnahme auftritt. Das erklärt Ryan Dahl in diesem Youtube-Video. http://youtu.be/jo_B4LTHi3I um min 56:30 um genau zu sein. Hoffe das hilft

3
ElHacker

Wenn Sie nur den Stack-Trace des Fehlers (und nicht die Fehlermeldung) protokollieren möchten, enthält Node 6 und höher automatisch den Fehlernamen und die Fehlermeldung im Stack-Trace, was etwas ärgerlich ist, wenn Sie möchten eine benutzerdefinierte Fehlerbehandlung durchführen:

console.log(error.stack.replace(error.message, ''))

Diese Problemumgehung protokolliert nur den Fehlernamen und die Stapelablaufverfolgung (sodass Sie beispielsweise die Fehlermeldung formatieren und anzeigen können, wie Sie sie an einer anderen Stelle in Ihrem Code haben möchten).

Das obige Beispiel gibt nur den Fehlernamen aus, auf den der Stack-Trace folgt. Beispiel:

Error: 
    at /Users/cfisher/Git/squashed/execProcess.js:6:17
    at ChildProcess.exithandler (child_process.js:213:5)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at maybeClose (internal/child_process.js:877:16)
    at Socket.<anonymous> (internal/child_process.js:334:11)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at Pipe._handle.close [as _onclose] (net.js:498:12)

Anstatt von:

Error: Error: Command failed: sh ./commands/getBranchCommitCount.sh HEAD
git: 'rev-lists' is not a git command. See 'git --help'.

Did you mean this?
        rev-list

    at /Users/cfisher/Git/squashed/execProcess.js:6:17
    at ChildProcess.exithandler (child_process.js:213:5)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at maybeClose (internal/child_process.js:877:16)
    at Socket.<anonymous> (internal/child_process.js:334:11)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at Pipe._handle.close [as _onclose] (net.js:498:12)
2
GrayedFox

@ isaacs Die Antwort ist richtig, aber ich habe eine richtigere Antwort. Diese Antwort ist inspiriert vom ursprünglichen Quellcode der Console-Klasse am Knoten js ( Quellcode ):

function getStack() {
  var err = new Error();

  Error.captureStackTrace(err, getStack);

  return err.stack;
}
1

Falls noch jemand danach sucht, wie ich es war, können wir ein Modul namens "stack-trace" verwenden. Es ist sehr beliebt. NPM-Verbindung

Dann gehen Sie durch die Spur.

  var stackTrace = require('stack-trace');
  .
  .
  .
  var trace = stackTrace.get();
  trace.map(function (item){ 
    console.log(new Date().toUTCString() + ' : ' +  item.toString() );  
  });

Oder drucken Sie einfach den Trace aus:

var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.toString();
1
Laszlo

sie können das Modul Node-Stack-Trace verwenden, das ein leistungsfähiges Modul zum Verfolgen von Aufrufstapeln ist.

0
Nitin9791