扩展Error对象时是否需要super(originalError)?

时间:2018-09-12 20:06:01

标签: javascript node.js logging ecmascript-6 error-handling

扩展Error对象时,我感到沮丧的是,调用super(originalError)会导致打印到STDOUT的正常堆栈跟踪。我希望日志以JSON格式格式化,以便Logstash / Kibana可以使用它们。 Kibana中包含\n的堆栈跟踪被分为多个条目,因为它显然并不真正知道如何处理该输入。我可以通过在登录之前进行一些修改来避免这种情况

function logError(errorDetails, stack) {
  logger.error({ errorDetails, stack: sanitizeLineBreaks(stack) } // removes `\n`
}

但是我正在实现的错误对象看起来像这样:

class ServerError extends Error {
  constructor(originalError, errorDetails, stack) {
    super(originalError) // <- this is the problem
    Error.captureStackTrace(this, ServerError)
    // stuff ...
    logError(originalError, stack)
  }
}

但是,调用super(originalError)将使用换行符打印到控制台。这会导致丑陋的条目,其中轨迹的每一行在Kibana GUI中都是单独的条目。当我 not 呼叫super(originalError)时,在控制台上没有收到任何投诉,但是我仍然很想删除它。

扩展super(originalError)对象时是否需要Error

1 个答案:

答案 0 :(得分:1)

(忽略日志记录问题)

  

扩展super(originalError)对象时是否需要Error

是的。 Every class that extends another and defines a custom constructor must call super() to create the instance