如何从Loopback 4中的控制器返回错误?

Sep*_*eed 3 error-handling loopbackjs

我有一个控制器方法

// ... inside a controller class

@get('/error', {})
async error() {
  throw new Error("This is the error text");
}
Run Code Online (Sandbox Code Playgroud)

我从此错误前端得到的响应是:

{“ error”:{“ statusCode”:500,“ message”:“内部服务器错误”}}

我想要的错误是:

{“ error”:{“ statusCode”:500,“ message”:“这是错误文本”}}

如何从Loopback 4中的控制器返回错误?

Mir*_*toš 6

LoopBack团队您好

在控制器或存储库中,应完全按照问题所示抛出错误。

现在,当LoopBack捕获错误时,它将调用reject操作来处理它。内置实现通过reject记录消息console.error并返回HTTP响应,其中包含4xx / 5xx错误代码和描述错误的响应正文。

默认情况下,LoopBack隐藏HTTP响应中的实际错误消息。这是一项安全措施,可防止服务器泄漏潜在的敏感数据(无法打开文件的路径,无法访问后端服务的IP地址)。

在幕后,我们使用强错误处理程序将Error对象转换为HTTP响应。该模块提供两种模式:

  • 生产模式(默认):5xx错误不包括任何其他信息,4xx错误包括部分信息。
  • 调试模式(debug: true):所有错误详细信息都包括在响应中,包括完整的堆栈跟踪。

可以通过将以下行添加到Application构造函数来启用调试模式:

this.bind(RestBindings.ERROR_WRITER_OPTIONS).to({debug: true});
Run Code Online (Sandbox Code Playgroud)

在我们的文档中了解更多信息:序列>>处理错误

另外,您可以实现自己的错误处理程序并将其绑定为sequence action 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);
  }
}
Run Code Online (Sandbox Code Playgroud)