Nic*_*lin 6 error-handling asynchronous node.js
我有点惊讶我没有被这个更多的咬,但是在另一个tick中执行的回调中创建的节点错误没有一个合理的堆栈跟踪.
例如
function base (cb) {
process.nextTick(() => {
throw new Error("I am unhelpful")
}, 1000)
}
function top (cb) {
base(cb)
}
top(() => {})
Run Code Online (Sandbox Code Playgroud)
结果是:
Error: I am unhelpful
at /Users/me/stacktrace.js:45:11
at _combinedTickCallback (internal/process/next_tick.js:135:11)
at process._tickCallback (internal/process/next_tick.js:180:9)
at Function.Module.runMain (module.js:607:11)
at startup (bootstrap_node.js:158:16)
at bootstrap_node.js:575:3
Run Code Online (Sandbox Code Playgroud)
当来自执行异步操作的库的回调/保证中发生异常时,这尤其不好,因为没有简单的路径备份跟踪以查找有问题的代码.想象一下涉及控制器,一些帮助模块和第三方库的服务调用.
到目前为止,我的解决方案是为当前tick中的潜在故障情况创建一个错误,然后在出现错误时将其传递给它:
function base (cb) {
let potentialError = new Error('oh noes')
process.nextTick((err) => {
potentialError.message = err.message
throw potentialError
}, 1000)
}
Run Code Online (Sandbox Code Playgroud)
这给了我一个实际包含调用链的堆栈跟踪:
Error: oh noes
at base (/Users/me/stacktrace.js:47:24)
at top (/Users/me/stacktrace.js:43:3)
at Object.<anonymous> (/Users/me/stacktrace.js:53:1)
Run Code Online (Sandbox Code Playgroud)
我知道像superstack这样的模块,但是它们会出现补丁错误,并且似乎不适用于最新版本的节点.
Core本身只支持异步堆栈跟踪,但这是一个不推荐用于生产的实验/ dev开发功能.
有没有更好的方法来实现我想要的?