malagu统一应答格式与自定义异常

导言
  • 本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接:https://github.com/weopenprojects/WeOpen-Star
  • 无论是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捕获异常后,日志不输出异常信息

本文为学习类文章,如有错误欢迎指正!思考内容欢迎各位大佬答疑解惑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值