有人知道如何在Node.js中打印堆栈跟踪吗?
任何Error
对象都有一个stack
成员,用于捕获它被构造的时刻。
var stack = new Error().stack
console.log( stack )
更简单地说:console.trace("Here I am!")
正如已经回答的那样,你可以简单地使用trace命令:
console.trace("I am here");
然而,如果您正在搜索如何记录异常的堆栈跟踪,只需记录异常对象即可。
try {
// if something unexpected
throw new Error("Something unexpected has occurred.");
} catch (e) {
console.error(e);
}
它将记录:
错误:发生了意外情况。
在 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)
在 Module.load(module.js:355:32)
在 Function.Module._load(module.js:310:12)
在 Function.Module.runMain(module.js:501:10)
在启动时(node.js:129:16)
在 node.js 中:814:3
如果您的Node.js版本小于6.0.0,仅记录异常对象将不足以应对此问题。在这种情况下,它只会打印:
[Error:Something unexpected has occurred。]
对于Node版本< 6,请使用 console.error(e.stack)
而不是 console.error(e)
来打印错误消息加上完整的堆栈,就像当前的Node版本一样。
注意:如果异常被创建为字符串,如 throw“myException”
,则无法检索堆栈跟踪,并且记录 e.stack
将产生< strong>未定义的结果。
为了安全起见,您可以使用
console.error(e.stack || e);
它适用于旧版和新版 Node.js。
e
对象中的所有内容,包括 e.stack
吗? - drmrbrewer6.9.4
),console.error(e)
只打印简短的消息。我怀疑这是因为它打印了e
的toString
表示形式,而e
的toString
仅返回消息而没有其他内容:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/toString - drmrbrewerconsole.error(new Error("test"))
以查看差异。关于此更改的参考资料,我在Node的变更记录中找不到。它似乎是V8的更改,但我也无法确认。 - Zanon为了以更易读的方式在控制台中打印Error
的堆栈跟踪:
console.log(ex, ex.stack.split("\n"));
示例结果:
[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)' ]
console.error(e)
。它会为你打印出堆栈跟踪信息。 - undefinederr.stack
。 - Clocher ZhonggetCleanerStack
而不是 getStack
。 - kikon1. 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
甚至更好的方法是在任何 JavaScript 代码中使用stacktracejs。
尝试使用Error.captureStackTrace(targetObject[, constructorOpt])。
const myObj = {};
function c() {
// pass
}
function b() {
Error.captureStackTrace(myObj)
c()
}
function a() {
b()
}
a()
console.log(myObj.stack)
函数a
和b
被捕获在错误堆栈中并存储在myObj
中。
stack
属性,你需要在 Node 版本大于等于 6 的情况下调用 Error.captureStackTrace(error)
。 - cjbarthError.captureStackTrace
的框架显示在堆栈跟踪中,则可以通过将其作为constructorOpt
参数传递来省略它。 - Ullauri获取函数调用者的详细信息:
/**
* @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;
}
}
使用方法:
function foo() {
console.info(getCallerLine());
}
foo(); // Prints this line as Caller Line details.
如果还有人像我一样在寻找这个功能,那么我们可以使用一个叫做 "stack-trace" 的模块。它非常流行。 NPM链接
然后沿着调用栈走一遍。
var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.map(function (item){
console.log(new Date().toUTCString() + ' : ' + item.toString() );
});
或者只需打印跟踪:
var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.toString();
'util'
替代。 - Pindatjuhnew Error().stack
的做法也表示赞同,该方法适用于不想使用控制台的情况。这种方法可以展示调用堆栈信息。 - Evgeniy Berezovskytrace
的一个优点是它显示当前行/上下文,而stack
不会。如果您想手动创建该行,则可以在错误对象中找到该信息。 - studgeek