Est-ce que quelqu'un sait comment imprimer une trace de pile dans Node.js?
Tout objet Error
a un membre stack
qui capture le point auquel il a été construit.
var stack = new Error().stack
console.log( stack )
ou plus simplement:
console.trace("Here I am!")
Maintenant, il y a un fonction dédiée sur la console pour cela:
console.trace()
Comme déjà répondu, vous pouvez simplement utiliser la commande trace :
console.trace("I am here");
Cependant, , si vous rencontrez cette question en cherchant comment enregistrer la trace de pile d'une exception , vous pouvez simplement enregistrer l'objet Exception.
try {
// if something unexpected
throw new Error("Something unexpected has occurred.");
} catch (e) {
console.error(e);
}
Il se connectera:
Erreur: Quelque chose d'inattendu s'est produit.
At main (c:\Users\Me\Documents\MyApp\app.js: 9: 15)
À Object. (c:\Users\Me\Documents\MyApp\app.js: 17: 1)
À Module._compile (module.js: 460: 26)
À Object.Module._extensions..js (module.js: 478: 10)
At Module.load (module.js: 355: 32)
At Function.Module._load (module.js: 310: 12)
À Function.Module.runMain (module.js: 501: 10)
Au démarrage (node.js: 129: 16)
À node.js: 814: 3
Si votre version de Node.js est <à 6.0.0 , la journalisation de l'objet Exception ne sera pas suffisante. Dans ce cas, il n’imprimera que:
[Erreur: Quelque chose d'inattendu s'est produit.]
Pour Node version <6, utilisez console.error(e.stack)
au lieu de console.error(e)
pour imprimer le message d'erreur ainsi que la pile complète, comme le fait la version Node actuelle.
Remarque: si l'exception est créée sous la forme d'une chaîne telle que throw "myException"
, il n'est pas possible de récupérer le suivi de la pile et la journalisation. e.stack
donne non défini .
Pour être en sécurité, vous pouvez utiliser
console.error(e.stack || e);
et cela fonctionnera pour les anciennes et nouvelles versions de Node.js.
Pour imprimer le tracé de pile de Error
dans la console de manière plus lisible:
console.log(ex, ex.stack.split("\n"));
Exemple de résultat:
[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)' ]
Avec un module Node facilement disponible, il est possible d’obtenir des traces de pile de longueur complète à partir de Node (avec toutefois une pénalité de performance mineure): http: // www .mattinsler.com/post/26396305882/advertizing-longjohn-long-stack-traces-for-node-js
Essayez Error.captureStackTrace (targetObject [ constructorOpt]) .
const myObj = {};
function c() {
// pass
}
function b() {
Error.captureStackTrace(myObj)
c()
}
function a() {
b()
}
a()
console.log(myObj.stack)
Les fonctions a
et b
sont capturées dans la pile d’erreurs et stockées dans myObj
.
Pour ce que je sais, imprimer la trace de pile complète dans nodejs n’est pas possible, vous pouvez simplement imprimer une trace de pile "partielle", vous ne pouvez pas voir d’où vous venez dans le code, juste où l’Exception se produit. C'est ce que Ryan Dahl explique dans cette vidéo sur youtube. http://youtu.be/jo_B4LTHi3I à min 56:30 pour être précis. J'espère que cela t'aides
Si vous souhaitez uniquement consigner la trace de la pile de l'erreur (et non le message d'erreur), Node 6 et supérieur inclut automatiquement le nom de l'erreur et le message dans la trace de la pile, ce qui est un peu gênant si vous souhaitez faire un peu de gestion des erreurs personnalisées:
console.log(error.stack.replace(error.message, ''))
Cette solution de contournement n'enregistrera que le nom de l'erreur et la trace de la pile (vous pourrez ainsi, par exemple, formater le message d'erreur et l'afficher comme bon vous semble ailleurs dans votre code).
L'exemple ci-dessus affiche uniquement le nom de l'erreur suivi de la trace de la pile, par exemple:
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)
Au lieu de:
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)
@ isaacs réponse est correcte, mais j'ai une réponse plus correcte. Cette réponse est inspirée du code source original de la classe Console au noeud js ( code source ):
function getStack() {
var err = new Error();
Error.captureStackTrace(err, getStack);
return err.stack;
}
Si quelqu'un cherche toujours comme moi, alors il existe un module appelé "stack-trace". C'est vraiment populaire. NPM Link
Puis parcourez la trace.
var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.map(function (item){
console.log(new Date().toUTCString() + ' : ' + item.toString() );
});
Ou simplement imprimez la trace:
var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.toString();
vous pouvez utiliser le module node-stack-trace qui est un module d'alimentation complète permettant de suivre les piles d'appels.