调试模式为 false 时如何在强错误处理程序中设置自定义错误

How to set custom error in strong-error-handler when debug mode is false

我正在使用 Loopback v3.x 和 strong-error-handler 来处理我的项目错误。错误响应在开发模式下很好,但在生产模式下,它会向客户端抛出不同的错误。

我意识到是 "debug": false" 使它抛出 { error: { statusCode: 500, message: 'Internal Server Error' } }(基于关于 strong-error-handler 的 Loopback 文档)

但是当我用 "debug": false 抛出 new Error('Error Messages') 时,我想在生产中显示我的错误(以防止敏感数据,如文件路径、URL 和堆栈跟踪暴露)

以下是我的配置文件:

config.json

{
  ...
  "remoting": {
    "rest": {
      "normalizeHttpPath": false,
      "xml": false,
      "handleErrors": false
    }
  }
}

middleware.development.json

{
  "final:after": {
    "strong-error-handler": {
      "params": {
        "debug": true,
        "log": true,
        "safeFields": [
          "code"
        ]
      }
    }
  }
}

middleware.json

{
  "final:after": {
    "strong-error-handler": {
      "params": {
        "debug": false,
        "log": true,
        "safeFields": [
          "code"
        ]
      }
    }
  }
}

我希望响应显示我抛出的错误,如下所示:

相反,现在它收到:

我去了 strongloop-error-handler GitHub library 但找不到任何关于抛出原始错误的文档。有可能这样做吗?

所以我深入研究了 strong-error-handler 库,发现如果我们手动将 statusCode 设置到错误中并且必须在 400 - 499 之内,那么技术上是可行的.

in buildResponseData() function:

if (data.statusCode >= 400 && data.statusCode <= 499) {
  fillBadRequestError(data, err);
} else {
  fillInternalError(data, err);
}

https://github.com/strongloop/strong-error-handler/blob/master/lib/data-builder.js#L37

and the fillBadRequestError() will return the original error

function fillBadRequestError(data, err) {
  data.name = err.name;
  data.message = err.message;
  data.code = err.code;
  data.details = err.details;
}

https://github.com/strongloop/strong-error-handler/blob/master/lib/data-builder.js#L69

所以,在抛出错误之前,我们可以设置:

const error = new Error();
error.name = 'Custom Error';
error.message = 'Error Message';
error.statusCode = 404;
throw error;

然后它会 return 即使使用 "debug": false 模式

的错误