如何将调用者详细信息添加到node.js中的错误堆栈跟踪?

时间:2017-08-03 08:49:34

标签: javascript error-handling promise

我有一个名为inner的函数执行一系列asinc操作:

function inner(input) {
    return step1(input)
    .then(step2)
    .then(step3)
    .catch((e) => {
        throw e
    })
}

我从内部重新抛出错误,因此我可以处理调用者级别的错误。

这是一个简单的例子:

app.get('/', function(req, res){
    inner(req)
    .then(result => {
        res.render('foo', result)
    }).catch((e) => {
        res.render('error', e);

        //eventually this would be changed to logger.error(e)
        console.log(e);
    })
})

问题在于,当我记录错误时,堆栈跟踪仅显示内部函数,但不显示调用者文件。如果我想在我的代码中使用此函数两次并发生错误,那么我需要知道我的代码的哪一部分称为它。

如何将调用者信息添加到错误堆栈跟踪?

1 个答案:

答案 0 :(得分:0)

非标准功能

由于Error.prototype.stack文档将其标记为非标准功能,因此不同的平台可能具有不同的行为和格式。

例如,我在Chrome中使用以下文件对其进行了测试:

<强>的index.html

<!doctype html>
<html>
  <head>
    <script src="inner.js"></script>
    <script src="caller1.js"></script>
    <script src="caller2.js"></script>
  </head>
  <body></body>
</html>

<强> inner.js

function inner() {
  return new Promise((resolve, reject) => {
    reject(new Error('Oh no'))
  }).catch(e => { throw e })
}

caller1.js caller2.js

inner().catch(e => { console.log(e.stack) })

结果在控制台

Error: Oh no
    at Promise (setup.js:3)
    at Promise (<anonymous>)
    at inner (setup.js:2)
    at caller1.js:1
Error: Oh no
    at Promise (setup.js:3)
    at Promise (<anonymous>)
    at inner (setup.js:2)
    at caller2.js:1

inner()和调用者都显示在堆栈跟踪中。

解决方法

在您的情况下,您可以手动将其记录在来电者的catch()

如果代码在浏览器中执行,请使用document.currentScript及其src属性来获取文件名。

编辑:在Node.js

我在Node.js v8.1.2中测试了它,同时也显示了inner()和调用者。

顺便说一下,document中的一段开头了:

  

请务必注意,帧仅为JavaScript生成   功能。例如,如果执行同步通过a   名为cheetahify的C ++插件函数,它本身调用JavaScript   函数,代表cheetahify调用的帧不会   存在于堆栈跟踪中

这可能是我们得到不一致结果的原因。

无论如何,我担心你仍然需要手动记录文件名,这取决于你如何导入和执行它们。