导言
- 本文已参加「开源摘星打算」,欢送正在浏览的你退出。流动链接:https://github.com/weopenproj…
- 无论是 restfull 格调 API 还是其余,对立的应答格局都是必要的。应答格局的统一使得接口标准、对立,接口也便于保护。
- 本文将举例手摸手讲述对立应答格局在 malagu 中的实际,其中也蕴含自定义异样的实现。
我的项目构造
红框文件:对立应答格局与自定义异样文件
对立应答格局实现
-
1. 定义 ResponseData 接口,文件:response-data.ts
export interface ResponseData<T> { code: 1 | number, data: T | null, message: string }
-
2. 定义应答后果格式化函数 responseJson,文件:format-util.ts
/* 格式化工具 * @Author: pwzhang * @Date: 2022-08-18 17:03:40 * @Last Modified by: pwzhang * @Last Modified time: 2022-08-18 17:17:53 */ import {ResponseData} from "../../common/data/response-data"; /** * 接口响应后果格式化 * @param data [any] 返回体 * @param error [error | string] 错误信息 | 谬误形容 * @returns { * code, 0- 失败;1- 胜利 * data, * message 谬误形容 * } */ export const responseJson = <T>(data: T, error: any = null) : ResponseData<T> => { let code: 0 | 1 = error ? 1 : 0; let message: string = error ? (error.message || error) : ''; return {code, data, message}; }
-
3. 在 controller 中利用 responseJson 函数
@Get("/:userId") @Json() @Authenticated() async getUserInfo(@Param("userId") userId: number) {this.logger.info(` 获取用户信息:${userId}`) const result = await this.userInfoService.getUserInfo(userId); return responseJson(result) }
应答后果:
至此,胜利应答的对立格局就实现了,接下来联合自定义异样的实现来工夫失败的应答
自定义异样的实际
-
1. 自定义异样类 WebCunstomError,文件:web-cunstom-error.ts
import {CustomError} from "@malagu/core"; /* * @Author: pwzhang * @Date: 2022-08-07 18:51:21 * @Last Modified by: pwzhang * @Last Modified time: 2022-08-19 14:56:01 */ export class WebCunstomError extends CustomError {constructor(public message: string = "未知的异样") {super(message); } }
-
2. 自定义异样处理器 WebCustomErrorHandler, 文件:web-custom-error-hander.ts
import {Autowired, Component, Logger} from "@malagu/core"; import {Context, ErrorHandler, HTTP_ERROR_HANDLER_PRIORITY,} from "@malagu/web/lib/node"; import {responseJson} from "../../node/utils/format-util"; import {WebCunstomError} from "../error/web-custom-error"; /* * @Author: pwzhang * @Date: 2022-08-07 18:24:19 * @Last Modified by: pwzhang * @Last Modified time: 2022-08-19 15:59:55 */ @Component([WebCustomErrorHandler, ErrorHandler]) export class WebCustomErrorHandler implements ErrorHandler { readonly priority: number = HTTP_ERROR_HANDLER_PRIORITY; @Autowired(Logger) protected logger: Logger; canHandle(ctx: Context, err: Error): Promise<boolean> {return Promise.resolve(err instanceof WebCunstomError) } async handle(ctx: Context, err: WebCunstomError): Promise<void> { // 完结线程 ctx.response.end(JSON.stringify(responseJson(null, err))); } }
-
3. 在 service 或 controller 文件中的利用自定义异样
async queryUserList(page: number, size: number, args: any): Promise<any> {throw new WebCunstomError("我是自定义异样"); }
谬误应答后果
结语
思考
- 应用 try catch 捕捉异样后,日志不输入异样信息
本文为学习类文章,如有谬误欢送斧正!思考内容欢送各位大佬答疑解惑。