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>...
消息推送问题梳理-团队管理
管理用户界面: 新增加用户列表:这些用有资格收到推送消户息 当删除一个医生的时候,重新添加这个人的时候 发现团队中没有这个人了 ,这个时候 需要重新添加这个人。 处理这个问题遵循的原则: 删除这个用户的时候&…...
如何在 Ubuntu 上使用 Docker 部署 LibreOffice Online
简介 LibreOffice Online(也称为Collabora Online)是一个开源的在线办公套件,它提供了与LibreOffice桌面版相似的功能,但完全在云端运行。这意味着用户可以通过浏览器访问和编辑文档,而无需在本地计算机上安装任何软件…...
MongoDB数据备份与恢复(内含工具下载、数据处理以及常见问题解决方法)
一、工具准备 对MongoDB进行导入导出、备份恢复等操作时需要用到命令工具,我们要先检查一下MongoDB安装目录下是否有这些工具,正常情况下是没有的:),因为新版本的MongoDB安装时不包含这些工具,需要我们手动下载安装。下载成功之后…...
代码随想录第三十一天| 56. 合并区间 738.单调递增的数字
56. 合并区间 题目描述 给定一个区间的集合 intervals,请合并所有重叠的区间。 解题思路 排序区间 按照每个区间的起点 start 升序排序,便于后续合并。 合并区间 使用两个变量 start 和 right 分别记录当前区间的起点和终点。遍历排序后的区间&#x…...
C语言基本知识 2.2void 函数
在C语言中, void 是一个重要的关键字,具有多种用途,以下是详细介绍: 函数返回值类型声明 - 当函数不需要返回任何值时,可以将函数的返回值类型声明为 void 。例如: void printMessage() { printf(…...
Spring 框架中哪些接口可以创建对象
Spring 框架中哪些接口可以创建对象 在 Spring 框架中,向 IOC 容器中添加 Bean 主要有以下几种接口和方式。Spring 提供了不同的手段来实现对象的创建和管理,涵盖了不同的需求和场景。以下是几种常用的接口和方式: 1. BeanFactory 接口 Be…...
豆瓣书摘 | 爬虫 | Python
获取豆瓣书摘,存入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数据库物理存储结构管理
大家好,我是程序员小羊! 前言: 安装和配置Oracle数据库是一个涉及多个步骤的任务,通常包括环境准备、软件安装、数据库创建和基本配置等。以下是详细的安装与配置流程。 一、环境准备 1. 系统要求 操作系统:Wind…...
java——Map接口
Java的Map接口是一种键值对的数据结构,用于存储和操作键值对的集合。它是Java集合框架中的一部分,提供了一种以键值对形式组织数据的方法。 Map接口有多个实现类,常用的有HashMap、TreeMap和LinkedHashMap。每种实现类都有不同的特点和适用场…...
量子计算机全面解析:技术、应用与未来
标题:量子计算机全面解析:技术、应用与未来 一、什么是量子计算机? 量子计算机是一种利用量子力学原理(如叠加、纠缠和干涉)进行计算的新型计算设备。与传统计算机基于比特(0 和 1)的运算方式不…...
IDEA相关(包括但不限于快捷键,使用技巧)成长笔记
1.IDEA创建及命名规范 IDEA创建是:项目、模块、包、类 命名规范: 1.项目名全部小写 2.包名全部小写 3.类名首字母大写,一般都是使用驼峰式命名。 如:public class MyFirstClass{} 4.同上: 变量名、方法名首字母小…...
【再谈设计模式】适配器模式 ~接口兼容的桥梁
一、引言 在软件开发的复杂世界里,不同的组件、类或者系统往往有着各自独立的设计和接口定义。当需要将这些原本不兼容的部分整合在一起协同工作时,就像尝试将方形的榫头插入圆形的卯眼一样困难。适配器设计模式就如同一位神奇的工匠,能够巧妙…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
