📜  loopback4 中的 cutsom 错误 (1)

📅  最后修改于: 2023-12-03 15:02:48.068000             🧑  作者: Mango

LoopBack 4 中的 Custom 错误

LoopBack 4 提供了一种简单的方式来自定义错误消息,以补充框架默认的错误消息,并提高应用程序的可读性。

如何创建自定义错误
  1. 继承 Error 类,并定义您自己的属性和方法。以下是一个简单的例子:
// custom-error.ts

export class CustomError extends Error {
  statusCode: number;
  code: string;
  message: string;

  constructor(statusCode: number, message: string) {
    super(message);
    this.statusCode = statusCode;
    this.code = 'CustomError';
    this.message = message;
  }
}

上述代码中,CustomError 继承了标准的 Error 类,并添加了一些自定义属性和在构造函数中初始化它们的方法。其中,statusCode 属性表示 HTTP 状态代码,code 属性表示错误代码,message 属性表示错误消息文本。

  1. 在您的应用程序中使用自定义错误。例如,当控制器数据验证失败时,可以使用以下代码抛出自定义错误:
// controller.ts

import {CustomError} from './custom-error';

export class MyController {
  async validateData(request: Request, response: Response) {
    const data = request.body;

    if (typeof data !== 'object' || Array.isArray(data)) {
      throw new CustomError(400, 'Invalid data format');
    }

    // ...
  }
}

如上所述,MyController 控制器的 validateData 方法使用 CustomError 抛出错误,其 statusCode 属性设置为 400,表示客户端请求格式无效,message 属性设置为“Invalid data format”。

如何使用自定义错误处理程序

为了防止应用程序中未处理的错误,您需要创建一个错误处理程序来处理所有的自定义错误。在 LoopBack 4 中,可以使用 @loopback/rest 模块提供的 ErrorHandler 类来实现该处理程序。以下是一个例子:

// error-handler.ts

import {ErrorHandler, RestHttpErrors} from '@loopback/rest';
import {CustomError} from './custom-error';

export class MyErrorHandler implements ErrorHandler {

  handleError(error: Error, request: Request, response: Response) {
    if (error instanceof CustomError) {
      const errorResponse = {
        status: error.statusCode,
        code: error.code,
        message: error.message,
      };
      response.status(error.statusCode).json(errorResponse);
    } else if (RestHttpErrors.isHttpError(error)) {
      const errorResponse = {
        status: error.statusCode,
        code: error.code || 'UnknownError',
        message: error.message,
      };
      response.status(error.statusCode).json(errorResponse);
    } else {
      console.error(error);
      const errorResponse = {
        status: 500,
        code: 'InternalServer',
        message: 'Internal server error',
      };
      response.status(500).json(errorResponse);
    }
  }
}

如上所述,MyErrorHandler 实现了 @loopback/rest 模块的 ErrorHandler 接口,并实现了 handleError 方法。该方法根据不同的错误类型,返回相应的 HTTP 响应和错误消息。对于自定义错误,返回自定义错误中定义的 statusCodecodemessage 属性。对于 LoopBack 框架的标准错误(如验证错误、身份验证错误等),提供默认的错误消息。对于其他未知错误,则输出“Internal server error”的错误消息。

如何在应用程序中使用自定义错误处理程序

在 LoopBack 4 应用程序中启用自定义错误处理程序非常简单。在 src/application.ts 中,只需实例化 MyErrorHandler 类,并将其添加到应用程序实例的 middleware 数组中即可。

// application.ts

import {BootMixin} from '@loopback/boot';
import {ApplicationConfig} from '@loopback/core';
import {RepositoryMixin} from '@loopback/repository';
import {RestApplication} from '@loopback/rest';
import {MyErrorHandler} from './error-handler';

export class MyApp extends BootMixin(RepositoryMixin(RestApplication)) {
  constructor(options: ApplicationConfig = {}) {
    super(options);

    this.middleware(MyErrorHandler);
  }
}

上述代码中,在应用程序的构造函数中实例化了 MyErrorHandler,并将其添加到应用程序实例的中间件数组中。从此以后,您的应用程序将使用自定义的错误消息来处理所有错误。