📅  最后修改于: 2023-12-03 15:02:48.068000             🧑  作者: Mango
LoopBack 4 提供了一种简单的方式来自定义错误消息,以补充框架默认的错误消息,并提高应用程序的可读性。
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
属性表示错误消息文本。
// 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 响应和错误消息。对于自定义错误,返回自定义错误中定义的 statusCode
、code
和 message
属性。对于 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
,并将其添加到应用程序实例的中间件数组中。从此以后,您的应用程序将使用自定义的错误消息来处理所有错误。