660 Stimmen

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

Weiß jemand, wie man einen Stack-Trace in Node.js drucken?

10voto

In v15.12.0 gibt es verschiedene Methoden, dies zu tun,

1. console.trace(anything)
2. Error.captureStackTrace(Object)
3. console.log(new Error().stack)
4. Try Catch - Use console.log(e), where `e` is catched by catch block

ODER noch besser stacktracejs in jedem Javascript-Code

5voto

Zheeeng Punkte 584

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 Funktion a y b werden im Fehlerstapel aufgefangen und in myObj .

3 Stimmen

Wenn Sie möchten, dass ein Fehler einen stack Eigenschaft müssen Sie dies aufrufen, wenn Node >= 6: Error.captureStackTrace(error) .

0 Stimmen

Beachten Sie, dass, wenn Sie nicht wollen, dass der Rahmen, der die Error.captureStackTrace im Stacktrace angezeigt werden soll, können Sie es weglassen, indem Sie es als constructorOpt arg.

3voto

ElHacker Punkte 1649

Soweit ich weiß, ist es nicht möglich, den kompletten Stacktrace in Nodejs auszudrucken, man kann nur einen "partiellen" Stacktrace ausdrucken, man kann nicht sehen, von wo aus man im Code gekommen ist, nur wo die Exception auftritt. Das ist, was Ryan Dahl in diesem youtube-Video erklärt. http://youtu.be/jo_B4LTHi3I bei mindestens 56:30, um genau zu sein. Hoffentlich hilft das

2 Stimmen

Stimmt, aber das Modul in @Timboudreaus Antwort "behebt" das

3voto

Laszlo Punkte 61

Für den Fall, dass jemand wie ich noch auf der Suche ist, gibt es ein Modul namens "stack-trace". Es ist sehr beliebt. NPM-Verbindung

Gehen Sie dann die Spur durch.

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

Oder drucken Sie einfach die Spur:

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

3voto

Eduardo Cuomo Punkte 15791

Details zum Funktionsaufrufer abrufen:

/**
 * @typedef {Object} TCallerInfo
 * @property {() => string} toString
 * @property {string} str Caller error stack line.
 * @property {string} file Caller file path.
 * @property {number} line Caller line.
 * @property {number} col Caller column.
 * @property {Error} error Caller error stack instance.
 */

/**
 * @returns {TCallerInfo | null}
 */
function getCallerLine() {
  const err = new Error();
  const stack = err.stack || '';
  const callerLine = stack.split(/\n\s*at\s+/g);

  if (callerLine.length >= 2) {
    const str = callerLine[3];
    const [file, line, col] = str
      .replace(/^\s*at\s+/, '')
      .replace(/^(.*):(\d+):(\d+)$/, '$1|$2|$3')
      .split(/\|/g);

    const o = {
      toString: () => str,

      get str() {
        return str;
      },

      get file() {
        return file;
      },

      get line() {
        return parseInt(line);
      },

      get col() {
        return parseInt(col);
      },

      get error() {
        return err;
      },
    };

    return o;
  } else {
    return null;
  }
}

Verwendung:

function foo() {
  console.info(getCallerLine());
}

foo(); // Prints this line as Caller Line details.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X