来自 LoopBack 团队的问候 ?
在您的控制器或存储库中,您应该完全按照您的问题所示抛出错误。
现在,当 LoopBack 捕获错误时,它会调用 reject 操作来处理它。 reject 的内置实现通过 console.error 记录一条消息,并返回带有 4xx/5xx 错误代码和描述错误的响应正文的 HTTP 响应。
默认情况下,LoopBack 会隐藏 HTTP 响应中的实际错误消息。这是一种安全措施,可防止服务器泄露潜在的敏感数据(无法打开的文件路径、无法访问的后端服务的 IP 地址)。
在底层,我们使用strong-error-handler 将错误对象转换为 HTTP 响应。该模块提供两种模式:
- 生产模式(默认):5xx 错误不包含任何附加信息,4xx 错误包含部分信息。
- 调试模式 (
debug: true):所有错误详细信息都包含在响应中,包括完整的堆栈跟踪。
调试模式可以通过添加下面一行到你的应用构造函数来启用:
this.bind(RestBindings.ERROR_WRITER_OPTIONS).to({debug: true});
在我们的文档中了解更多信息:Sequence >> Handling errors
或者,您可以实现自己的错误处理程序并将其绑定为序列操作reject。请参阅我们的文档中的 Customizing sequence actions。
export class MyRejectProvider implements Provider<Reject> {
constructor(
@inject(RestBindings.SequenceActions.LOG_ERROR)
protected logError: LogError,
@inject(RestBindings.ERROR_WRITER_OPTIONS, {optional: true})
protected errorWriterOptions?: ErrorWriterOptions,
) {}
value(): Reject {
return (context, error) => this.action(context, error);
}
action({request, response}: HandlerContext, error: Error) {
const err = <HttpError>error;
const statusCode = err.statusCode || err.status || 500;
const body = // convert err to plain data object
res.statusCode = statusCode;
res.setHeader('Content-Type', 'application/json; charset=utf-8');
res.end(JSON.stringify(body), 'utf-8');
this.logError(error, statusCode, request);
}
}