LoopBack 团队的问候
在您的控制器或存储库中,您应该完全按照您的问题所示抛出错误。
现在,当 LoopBack 捕获错误时,它会调用reject
操作来处理它。内置实现通过reject
记录消息console.error
并返回带有 4xx/5xx 错误代码和描述错误的响应正文的 HTTP 响应。
默认情况下,LoopBack 隐藏 HTTP 响应中的实际错误消息。这是一种安全措施,可防止服务器泄露潜在的敏感数据(无法打开的文件路径、无法访问的后端服务的 IP 地址)。
在底层,我们使用strong-error-handler将 Error 对象转换为 HTTP 响应。该模块提供两种模式:
- 生产模式(默认):5xx 错误不包含任何附加信息,4xx 错误包含部分信息。
- 调试模式 (
debug: true
):所有错误详细信息都包含在响应中,包括完整的堆栈跟踪。
可以通过将以下行添加到应用程序构造函数来启用调试模式:
this.bind(RestBindings.ERROR_WRITER_OPTIONS).to({debug: true});
在我们的文档中了解更多信息:序列 >> 处理错误
或者,您可以实现自己的错误处理程序并将其绑定为序列操作reject
。请参阅我们的文档中的自定义序列操作。
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);
}
}