JavaScript错误未显示在控制台中?

Con*_*sea 5 javascript node.js express ecmascript-6

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))
}
Run Code Online (Sandbox Code Playgroud)

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

{
  "error": true,
  "data": {
    "message": "fields is not defined"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Jac*_*cob 7

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

如果您希望记录它,您可以throw err在catch块的末尾添加一个.这会将其转换为未处理的promise拒绝,通常与未处理的异常类似地处理.

  • @estus你需要重新抛出它才能被认为是"未处理的拒绝",但对于那些记录任何有用的东西,你的应用程序也需要手动记录它们.Chrome会自动执行,Node不会:https://nodejs.org/api/process.html#process_event_unhandledrejection (2认同)
  • 我们有一个节点项目,我们在`unhandledRejection`事件中进行了抛出,以稍微统一两个错误系统行为.对于浏览器项目,我们通常只是让默认的控制台日志记录行为发生,但我知道像Bluebird这样的库为浏览器应用程序提供了更多的全局事件处理程序方法.我不确定是否还有一个既定的事实.IMO你有预期或意外的错误,除非你有一个明确的意外行为,没有什么有用的,你可以没有记录. (2认同)