【问题标题】:JavaScript errors not showing up in console?JavaScript 错误未显示在控制台中?
【发布时间】:2017-01-19 09:51:15
【问题描述】:

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))
}

由于 catch 响应错误,我收到以下 API 响应:

{
  "error": true,
  "data": {
    "message": "fields is not defined"
  }
}

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

【问题讨论】:

  • promise 中发生的错误不会传播到控制台吗?例如,如果我只是在 Chrome 控制台中输入 console.log(x),它会给我 Uncaught ReferenceError: x is not defined 和堆栈跟踪。

标签: javascript node.js express ecmascript-6


【解决方案1】:

自动记录到控制台是一种未处理异常的机制。因为 Promise 会在回调中自动捕获异常,所以不再处理异常,因此不会自动记录任何内容。

如果你希望它被记录,你也许可以在你的 catch 块的末尾添加一个throw err。这会将其转换为未处理的 Promise 拒绝,其处理方式通常类似于未处理的异常。

【讨论】:

  • 现在我看到了人们对 Promise 的一些问题。这有点糟透了。谢谢你的解释。
  • 第二部分答案不正确。投入catch 不会影响任何事情。在最新的 Chrome 版本中,它可能被列为“未捕获的承诺”错误,但在 Node 原生承诺中则不会。
  • @estus 您需要重新抛出它才能将其视为unhandled rejection 但对于那些在任何有用的地方进行日志记录的人,您的应用程序还需要手动记录它们。 Chrome 会自动执行,Node 不会:nodejs.org/api/process.html#process_event_unhandledrejection
  • 那么人们通常如何处理 Promise 中的错误呢?你们中的任何一个人都会推荐关于这个主题的任何文章或文章吗?谢谢!
  • 我们有一个节点项目,我们在unhandledRejection 事件中进行了抛出以在某种程度上统一两个错误系统行为。对于浏览器项目,我们通常只是让默认的控制台日志记录行为发生,但我知道像 Bluebird 这样的库为浏览器应用程序提供了更多的全局事件处理程序方法。我不确定是否有一个既定的事实。 IMO,您要么有预期的错误,要么有意外的错误,除非您对意外的行为有明确的定义,否则除了记录之外,您真的无能为力。
【解决方案2】:

因为您实际上并没有记录错误?

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 和堆栈跟踪。
【解决方案3】:

我遇到了一个类似的问题,由附加到运行的主异步函数的“finally”引起。

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

修改为:

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

解决了问题

【讨论】:

    猜你喜欢
    • 2016-02-11
    • 2013-12-09
    • 2021-02-13
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 2021-12-02
    相关资源
    最近更新 更多