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

时间:2016-09-12 01:09:27

标签: 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))
}

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

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

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

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分: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);
    });
}

答案 2 :(得分:0)

我遇到了一个类似的问题,最终导致了#39;这是附加到运行的主异步函数。

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

将其修改为:

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

解决了问题