有人知道如何在Node.js中打印堆栈跟踪吗?
当前回答
现在主机上有一个专门的功能:
console.trace()
其他回答
@isaacs的答案是正确的,但如果你需要更具体或更清晰的错误堆栈,你可以使用这个函数:
function getCleanerStack() {
var err = new Error();
Error.captureStackTrace(err, getCleanerStack);
return err.stack;
}
这个功能的灵感直接来自控制台。NodeJS中的trace函数。
源代码:最新版本或旧版本。
现在主机上有一个专门的功能:
console.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();
据我所知,在nodejs中打印完整的堆栈跟踪是不可能的,你可以只打印“部分”堆栈跟踪,你无法看到你从代码中的哪里来,只是异常发生的地方。这就是瑞恩·达尔在youtube视频中解释的内容。http://youtu.be/jo_B4LTHi3I为了精确,至少56:30。希望这能有所帮助
获取函数调用者详细信息:
/**
* @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.
推荐文章
- JavaScript: override alert()
- 重置setTimeout
- 如何确保<select>表单字段被禁用时提交?
- jQuery有不聚焦的方法吗?
- 反应钩子-正确的方式清除超时和间隔
- TypeScript枚举对象数组
- 在React.js中正确的img路径
- 在React.js中更新组件onScroll的样式
- onClick ReactJS调用多个函数
- 如何在JavaScript中转义单引号(')?
- Ng-repeat结束事件
- 谷歌MAP API未捕获的类型错误:无法读取属性“offsetWidth”为空
- 模糊vs聚焦-有什么真正的区别吗?
- 如何使用JavaScript创建和样式一个div ?
- 清除JavaScript中的缓存