导言
- 本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接: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捕获异常后,日志不输出异常信息
本文为学习类文章,如有错误欢迎指正!思考内容欢迎各位大佬答疑解惑。
相关文章
暂无评论...