Alguém sabe como imprimir um rasto de pilha no Node.js?
Agora, há's uma função dedicada na consola para isso:
console.trace()
Como já respondido, você pode simplesmente usar o comando trace:
console.trace("I am here");
No entanto, se você chegou a esta pergunta pesquisando sobre como registrar o rastro de uma exceção, você pode simplesmente registrar o objeto Exceção.
try {
// if something unexpected
throw new Error("Something unexpected has occurred.");
} catch (e) {
console.error(e);
}
Ele vai registar:
Erro: Algo inesperado ocorreu.
no principal (c:\iSeuAplic.js:9:15)
em Object.<anónimo> (c:\i1)
no módulo._compile (módulo.js:460:26)
em Object.Module._extensions..js (module.js:478:10)
no Module.load (modulo.js:355:32)
em Function.Module._load (module.js:310:12)
em Function.Module.runMain (module.js:501:10)
na inicialização (node.js:129:16)
no node.js:814:3
Se a sua versão Node.js é <
do que 6.0.0, o registo do objecto Excepção não será suficiente.
Neste caso, ele será impresso apenas:
[Erro: Algo inesperado ocorreu.]
Para Node version <
6, utilize console.error(e.stack)
ao invés de console.error(e)
para imprimir a mensagem de erro mais a pilha completa, como faz a versão atual do Nó.
Note: se a exceção for criada como uma string como throw "myException"
, it's not possible to retrive the stack trace and logging e.stack
yields **undefined***.
Para ser seguro, você pode usar o comando
console.error(e.stack || e);
e vai funcionar para as versões antiga e nova do Node.js.
Para imprimir o stacktrace do ``Error``` no console de uma forma mais legível:
console.log(ex, ex.stack.split("\n"));
Exemplo de resultado:
[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)' ]
Com um módulo de Nodo prontamente disponível, é possível obter traços de empilhamento de todo o comprimento do Nodo (embora com uma pequena penalização de desempenho): http://www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack-traces-for-node-js
Porque o que sei não é possível imprimir o rastreio completo da pilha em nodejs, pode apenas imprimir um "partial" stack trace, não pode ver de onde veio no código, apenas de onde ocorre a Excepção. Isso's o que Ryan Dahl explica neste vídeo do youtube.
no min 56:30 por ser preciso. Espero que isto ajudeTente [Error.captureStackTrace(targetObject[, constructorOpt])][1].
const myObj = {};
function c() {
// pass
}
function b() {
Error.captureStackTrace(myObj)
c()
}
function a() {
b()
}
a()
console.log(myObj.stack)
As funções a' e
b' são capturadas na pilha de erros e armazenadas em `myObj'.
[1]: https://nodejs.org/api/errors.html#errors_error_capturestacktrace_targetobject_constructoropt
Se você quiser apenas registrar o rastreamento de pilha do erro (e não a mensagem de erro) O nó 6 e superior inclui automaticamente o nome do erro e a mensagem dentro do rastreamento de pilha, o que é um pouco irritante se você quiser fazer algum tratamento de erro personalizado:
console.log(error.stack.replace(error.message, ''))
Esta solução só registará o nome do erro e o rastreamento da pilha (para que possa, por exemplo, formatar a mensagem de erro e exibi-la como quiser em outro lugar no seu código).
O exemplo acima imprimiria apenas o nome do erro seguido pelo stack trace, por exemplo:
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)
Em vez 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][1] resposta está correcta, mas eu tenho uma resposta mais correcta. Esta resposta é inspirada no código fonte original da classe Console no nó js ([código fonte][2]):
function getStack() {
var err = new Error();
Error.captureStackTrace(err, getStack);
return err.stack;
}
[1]: https://stackoverflow.com/users/352493/isaacs [2]: https://github.com/nodejs/node-v0.x-archive/blob/ed0d1c384cd4578f7168633c838f1252bddb260e/lib/console.js#L94
Caso alguém ainda esteja procurando por isso como eu estava, então há um módulo que podemos usar chamado "stack-trace". É realmente popular. [NPM Link][1]
Então anda através do rasto.
var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.map(function (item){
console.log(new Date().toUTCString() + ' : ' + item.toString() );
});
Ou simplesmente imprima o traço:
var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.toString();
você pode usar o módulo [node-stack-trace][1], que é um módulo de energia total para rastrear pilhas de chamadas.