控制台中没有显示JavaScript错误?

7
以下代码片段中,fields未定义,但是当出现错误时并没有被记录到控制台。在这种特定情况下,为什么会出现这种情况,以及实际上处理这种情况的方法是什么? "Testing"被记录到控制台(第2行),但未定义变量fields(第4行)并未被报告。该错误在API响应中返回(第5行),但没有相关信息,如行号、堆栈跟踪等。
我该如何使这样的错误被记录到控制台,为什么它们没有被记录?
export function post(req, res) {
  console.log("Testing")
  User.create( getFields(req, ["name_first", "name_last"]) )
    .then(user =>  respondJSON (res, fields, { status: 201 }))
    .catch(err => respondError (res, err))
}

由于抓取出现了错误,我得到了以下API响应:
{
  "error": true,
  "data": {
    "message": "fields is not defined"
  }
}

我正在使用Babel 6和babel-node通过NPM脚本运行我的代码。我也在使用morgan日志记录。删除日志中间件不会改变错误输出。

在 Promise 中发生的错误不会传播到控制台吗?例如,如果我只是在 Chrome 控制台中键入 console.log(x),它会给出 Uncaught ReferenceError: x is not defined 和一个堆栈跟踪。 - Connorelsea
3个回答

11

自动记录到控制台是一种用于未处理异常的机制。因为 Promise 自动捕获回调函数中的异常,所以这些异常不再是未处理异常,因此没有任何自动记录。

如果你想记录下来,可以在 catch 块的末尾添加 throw err。这将把它转换为未处理的 Promise 拒绝,这通常会被类似于未处理异常的方式处理。


现在我明白了人们在使用Promise时遇到的一些问题。有点糟糕。谢谢你的解释。 - Connorelsea
1
答案的第二部分是不正确的。加入catch不会影响任何事情。在最新版本的Chrome中,它可能被列为“未捕获的Promise”错误,但在Node原生Promise中不会出现这种情况。 - Estus Flask
2
@estus 你需要重新抛出异常才能被视为“未处理的拒绝”,但是为了在任何有用的地方记录它们,你的应用程序还需要手动记录它们。Chrome会自动执行此操作,但Node不会:https://nodejs.org/api/process.html#process_event_unhandledrejection - loganfsmyth
那么人们通常如何处理承诺中的错误?你们两个有没有推荐的关于这个主题的文章或写作?谢谢! - Connorelsea
2
我们有一个节点项目,在其中我们在unhandledRejection事件中进行了抛出,以在某种程度上统一两个错误系统的行为。对于浏览器项目,我们通常只是让默认的控制台日志记录行为发生,但我知道像Bluebird这样的库为浏览器应用程序提供了更全局的事件处理程序方法。我不确定是否已经有了一个既定的标准。在我看来,你要么有预期的错误,要么有意外的错误,除非你对意外情况有一个定义好的行为,否则你真的没有什么有用的事情可以做,除了记录。 - Jacob
显示剩余2条评论

1
因为你实际上没有记录错误?
export function post(req, res) {
  console.log("Testing")
  User.create( getFields(req, ["name_first", "name_last"]) )
    .then(user =>  respondJSON (res, fields, { status: 201 }))
    .catch(err => {
      console.error(err);
      respondError(res, err);
    });
}

我明白,但是这样的错误不会只显示为错误吗?如果我在Chrome控制台中只键入console.log(x),它会给我返回Uncaught ReferenceError: x is not defined和一个堆栈跟踪。 - Connorelsea

0

我曾经遇到过类似的问题,是由于在主要的异步函数中添加了一个“finally”导致的。

run()
.finally(()=>{process.exit(0)})

修改为:

run()
.catch(err => {console.log(err)})
.finally(()=>{process.exit(0)})

问题已解决


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接