当前位置: 首页 > news >正文

go-zero(四) 错误处理(统一响应信息)

go-zero 错误处理(统一响应信息)

在实现注册逻辑时,尝试重复注册可能会返回 400 状态码,显然不符合正常设计思维。我们希望状态码为 200,并在响应中返回错误信息。
在这里插入图片描述

一、使用第三方库

1.下载库

目前 go-zero官方的 zeromicro 下有一个 x 仓库,可以实现统一响应格式,我们先安装下:

go get github.com/zeromicro/x

它会自动帮我们把响应信息改为下面这种格式:

{"code": 0,"msg": "ok","data": {...}
}

2.修改handler

接着我们修改internal/handler/register/registerhandler.go文件,把原来的响应处理,替换成这个库的:

//导入zeromicro库并设置别名,避免和原生的http冲突
import (xhttp "github.com/zeromicro/x/http"  
)//修改RegisterHandler的返回信息
func RegisterHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {var req types.RegisterRequestif err := httpx.Parse(r, &req); err != nil {//使用xhttp.JsonBaseResponseCtx 替换掉httpx.ErrorCtxxhttp.JsonBaseResponseCtx(r.Context(), w, err)//httpx.ErrorCtx(r.Context(), w, err)return}l := register.NewRegisterLogic(r.Context(), svcCtx)resp, err := l.Register(&req)if err != nil {//使用xhttp.JsonBaseResponseCtx 替换掉httpx.ErrorCtxxhttp.JsonBaseResponseCtx(r.Context(), w, err)//httpx.ErrorCtx(r.Context(), w, err)} else {//使用xhttp.JsonBaseResponseCtx 替换掉httpx.OkJsonCtxxhttp.JsonBaseResponseCtx(r.Context(), w, resp)//httpx.OkJsonCtx(r.Context(), w, resp)}}
}

3.修改返回错误

internal/logic/user/registerlogic.go 文件中,把原来的err 修改成 errors.New() ,它的参数有两个,一个是用来返回 code码 ,还有一个是message消息:

func (l *RegisterLogic) Register(req *types.RegisterRequest) (resp *types.RegisterResponse, err error) {// todo: add your logic here and delete this line/*.....*/if user != nil {//return nil, errreturn nil, errors.New(1, "用户已注册")}//插入新的数据/*.....*/if err != nil {//return nil, errreturn nil, errors.New(2, "用户注册失败")}}

接着我们运行项目,使用Postman重新测试,结果如下:
在这里插入图片描述

二、自定义错误管理

如果你不想使用这个库,或者想自己实现一些自定义错误,那么你也可以自己设置错误管理

1.自定义错误结构与格式化

我们在internal目录下新建biz目录,用于业务处理,然后再这个目录下分别创建3个文件

创建biz.go 文件

package biztype Error struct {Code int    `json:"code"`Msg  string `json:"msg"`
}func NewError(code int, msg string) *Error {return &Error{Code: code,Msg:  msg,}
}func (e *Error) Error() string {return e.Msg
}

创建resp.go 文件

package biztype Result struct {Code int    `json:"code"`Msg  string `json:"msg"`Data any    `json:"data"`
}func Success(data any) *Result {return &Result{Code: Ok,Msg:  "success",Data: data,}
}func Fail(err *Error) *Result {return &Result{Code: err.Code,Msg:  err.Msg,}
}

创建vars.go 文件

package bizconst Ok = 200var (AlreadyRegister = NewError(1, "用户已注册")PasswordErr     = NewError(2, "密码错误")InsertErr       = NewError(3, "用户注册失败")
)

2. 使用 httpx.Error 和 httpx.SetErrorHandler

接着修改user.go 文件:

	/*....*/defer server.Stop()//httpx.SetErrorHandler 函数可以帮助你定义一个全局的错误处理逻辑,//该逻辑会在 HTTP handler 中捕获到的所有错误中执行。//它将允许你统一处理各类错误,返回更加一致和用户友好的响应。//httpx.SetErrorHandler 仅在调用了 httpx.Error 处理响应时才有效。httpx.SetErrorHandler(func(err error) (int, any) {switch e := err.(type) {case *biz.Error:// 自定义一个 错误返回类型return http.StatusOK, biz.Fail(e)default:return http.StatusInternalServerError, nil}})ctx := svc.NewServiceContext(c)/*....*/

修改internal/handler/register/registerhandler.go文件:

func RegisterHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {var req types.RegisterRequestif err := httpx.Parse(r, &req); err != nil {//httpx.SetErrorHandler 仅在调用了 httpx.Error 处理响应时才有效。//所以我们现在还是使用原来的httpx.ErrorCtxhttpx.ErrorCtx(r.Context(), w, err)return}l := register.NewRegisterLogic(r.Context(), svcCtx)resp, err := l.Register(&req)if err != nil {//httpx.SetErrorHandler 仅在调用了 httpx.Error 处理响应时才有效。//所以我们现在还是使用原来的httpx.ErrorCtxhttpx.ErrorCtx(r.Context(), w, err)} else {//成功的请求,httpx.SetErrorHandler 是捕获不到的// 所以需要我们自定义返回信息httpx.OkJsonCtx(r.Context(), w, biz.Success(resp))}}
}

3.实现统一的错误响应机制

接下来,修改 internal/user/register/registerlogic.go文件:

func (l *RegisterLogic) Register(req *types.RegisterRequest) (resp *types.RegisterResponse, err error) {// todo: add your logic here and delete this line/*...*/if user != nil {//return nil, errors.New(1, "用户已注册")return nil, biz.AlreadyRegister}//插入新的数据/*...*/if err != nil {//return nil, errors.New(2, "用户注册失败")return nil, biz.InsertErr}}

接着运行测试
在这里插入图片描述

相关文章:

go-zero(四) 错误处理(统一响应信息)

go-zero 错误处理(统一响应信息) 在实现注册逻辑时,尝试重复注册可能会返回 400 状态码,显然不符合正常设计思维。我们希望状态码为 200,并在响应中返回错误信息。 一、使用第三方库 1.下载库 目前 go-zero官方的…...

1.1 爬虫的一些知识(大模型提供语料)

1.1 爬虫的一些知识(大模型提供语料) 网页资源: 资源组织方式:列表分页,搜索引擎,推荐 发送请求的文档类型:html ,js 响应请求的文档类型:html,js,json 请求方式:同步和异步 页面形式…...

Linux开发工具:Vim 与 gcc,打造高效编程的魔法双剑

文章目录 一、初识Vim模式 二、vim基本操作2.1基础操作2.2命令模式/正常模式2.2.1光标定位2.2.2复制粘贴、删除2.2.3撤销2.2.4替换字符2.2.5替换模式 2.3底行模式2.3.1退出vim和**保存文件**2.3.2定位文本字符串2.3.3命令2.3.4实现分屏2.3.5替换指定字符串 2.4补充指令2.4.1视图…...

cesium for unity的使用

先聊聊导入 看到这里的因该能够知道,官网以及网上绝大多数的方法都导入不进来,那么解决方法如下: 两个链接:按照顺序依次下载这两个tgz和zip,其中tgz为主要部分,zip为示例工程项目 如果您要查看示例工程项目的话&am…...

Android AOSP 架构和各层次开发内容介绍

一、系统架构总况​​​​ 官方文档:架构概览 | Android Open Source Project (google.cn)https://source.android.google.cn/docs/core/architecture?hl=zh-cn 下面是Google Android 提供的最新架构层次图: 图. AOSP 的软件堆栈层次 System API 表示仅供合作伙伴和 OEM…...

Kafka 到 Kafka 数据同步

简述 Kafka 为处理实时数据提供了一个统一、高吞吐、低延迟的平台,其持久化层本质上是一个“按照分布式事务日志架构的大规模发布/订阅消息队列”,这使它作为企业级基础设施来处理流式数据非常有价值。因此实现 Kafka 到 Kafka 的数据同步也成了一项重要…...

华为刷题笔记--题目索引

文章目录 更多关于刷题的内容欢迎订阅我的专栏华为刷题笔记简单题目 更多关于刷题的内容欢迎订阅我的专栏华为刷题笔记 该专栏题目包含两部分: 100 分值部分题目 200 分值部分题目 所有题目都会陆续更新,订阅防丢失 简单题目 –题目分值试卷1华为OD机…...

osgEarth加载倾斜摄影测量数据

一、代码 // .cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <osgViewer/Viewer> #include <osgEarth/Notify> #include <osgEarth/EarthManipulator>...

消息推送问题梳理-团队管理

管理用户界面&#xff1a; 新增加用户列表&#xff1a;这些用有资格收到推送消户息 当删除一个医生的时候&#xff0c;重新添加这个人的时候 发现团队中没有这个人了 &#xff0c;这个时候 需要重新添加这个人。 处理这个问题遵循的原则&#xff1a; 删除这个用户的时候&…...

如何在 Ubuntu 上使用 Docker 部署 LibreOffice Online

简介 LibreOffice Online&#xff08;也称为Collabora Online&#xff09;是一个开源的在线办公套件&#xff0c;它提供了与LibreOffice桌面版相似的功能&#xff0c;但完全在云端运行。这意味着用户可以通过浏览器访问和编辑文档&#xff0c;而无需在本地计算机上安装任何软件…...

MongoDB数据备份与恢复(内含工具下载、数据处理以及常见问题解决方法)

一、工具准备 对MongoDB进行导入导出、备份恢复等操作时需要用到命令工具&#xff0c;我们要先检查一下MongoDB安装目录下是否有这些工具&#xff0c;正常情况下是没有的:)&#xff0c;因为新版本的MongoDB安装时不包含这些工具&#xff0c;需要我们手动下载安装。下载成功之后…...

代码随想录第三十一天| 56. 合并区间 738.单调递增的数字

56. 合并区间 题目描述 给定一个区间的集合 intervals&#xff0c;请合并所有重叠的区间。 解题思路 排序区间 按照每个区间的起点 start 升序排序&#xff0c;便于后续合并。 合并区间 使用两个变量 start 和 right 分别记录当前区间的起点和终点。遍历排序后的区间&#x…...

C语言基本知识 2.2void 函数

在C语言中&#xff0c; void 是一个重要的关键字&#xff0c;具有多种用途&#xff0c;以下是详细介绍&#xff1a; 函数返回值类型声明 - 当函数不需要返回任何值时&#xff0c;可以将函数的返回值类型声明为 void 。例如&#xff1a; void printMessage() { printf(…...

Spring 框架中哪些接口可以创建对象

Spring 框架中哪些接口可以创建对象 在 Spring 框架中&#xff0c;向 IOC 容器中添加 Bean 主要有以下几种接口和方式。Spring 提供了不同的手段来实现对象的创建和管理&#xff0c;涵盖了不同的需求和场景。以下是几种常用的接口和方式&#xff1a; 1. BeanFactory 接口 Be…...

豆瓣书摘 | 爬虫 | Python

获取豆瓣书摘&#xff0c;存入MongoDB中。 import logging import timeimport requests from bs4 import BeautifulSoup from pymongo import MongoClientheaders {accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,image/apng,*/*;q0.8,…...

Oracle数据库物理存储结构管理

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 安装和配置Oracle数据库是一个涉及多个步骤的任务&#xff0c;通常包括环境准备、软件安装、数据库创建和基本配置等。以下是详细的安装与配置流程。 一、环境准备 1. 系统要求 操作系统&#xff1a;Wind…...

java——Map接口

Java的Map接口是一种键值对的数据结构&#xff0c;用于存储和操作键值对的集合。它是Java集合框架中的一部分&#xff0c;提供了一种以键值对形式组织数据的方法。 Map接口有多个实现类&#xff0c;常用的有HashMap、TreeMap和LinkedHashMap。每种实现类都有不同的特点和适用场…...

量子计算机全面解析:技术、应用与未来

标题&#xff1a;量子计算机全面解析&#xff1a;技术、应用与未来 一、什么是量子计算机&#xff1f; 量子计算机是一种利用量子力学原理&#xff08;如叠加、纠缠和干涉&#xff09;进行计算的新型计算设备。与传统计算机基于比特&#xff08;0 和 1&#xff09;的运算方式不…...

IDEA相关(包括但不限于快捷键,使用技巧)成长笔记

1.IDEA创建及命名规范 IDEA创建是&#xff1a;项目、模块、包、类 命名规范&#xff1a; 1.项目名全部小写 2.包名全部小写 3.类名首字母大写&#xff0c;一般都是使用驼峰式命名。 如&#xff1a;public class MyFirstClass{} 4.同上&#xff1a; 变量名、方法名首字母小…...

【再谈设计模式】适配器模式 ~接口兼容的桥梁

一、引言 在软件开发的复杂世界里&#xff0c;不同的组件、类或者系统往往有着各自独立的设计和接口定义。当需要将这些原本不兼容的部分整合在一起协同工作时&#xff0c;就像尝试将方形的榫头插入圆形的卯眼一样困难。适配器设计模式就如同一位神奇的工匠&#xff0c;能够巧妙…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...