go-zero 实战(4)

中间件

在 userapi 项目中引入中间件。go项目中的中间可以处理请求之前和之后的逻辑。

1. 在 userapi/internal目录先创建 middlewares目录,并创建 user.go文件

package middlewares

import (
	"github.com/zeromicro/go-zero/core/logx"
	"net/http"
)

type UserMiddleware struct {
}

func NewUserMiddleware() *UserMiddleware {
	return &UserMiddleware{}
}

func (*UserMiddleware) LoginAndReg(next http.HandlerFunc) http.HandlerFunc {

	return func(w http.ResponseWriter, r *http.Request) {
		logx.Info("execute before login and register")
		next(w, r)
		logx.Info("execute after login and register")
	}
}

这里,就定义了一个中间件。

2. 在 userapi/internal/svc/servicecontext.go 文件中创建一个中间件实例

package svc

import (
	"github.com/zeromicro/go-zero/zrpc"
	"rpc-common/userclient"
	"userapi/internal/middlewares"

	"userapi/internal/config"
)

type ServiceContext struct {
	Config         config.Config
	UserRpc        userclient.User
	UserMiddleware *middlewares.UserMiddleware // 定义中间件
}

func NewServiceContext(c config.Config) *ServiceContext {
	return &ServiceContext{
		Config:         c,
		UserRpc:        userclient.NewUser(zrpc.MustNewClient(c.UserRpc)),
		UserMiddleware: middlewares.NewUserMiddleware(), // 创建中间件实例
	}
}

3. 修改 userapi/internal/handler/routers.go 文件

在这里插入图片描述
在这里引入了路由中间件。

4. 修改 userapi/internal/logic/userapilogic.go文件

在该文件中,修改 Login 方法,加入一行日志。为了后面测试用。

func (l *UserLogic) Login(t *types.LoginRequest) (string, error) {

	logx.Info("login executing....")  // 新加入的代码
	userId := 100
	auth := l.svcCtx.Config.Auth
	return l.getToken(auth.AccessSecret, time.Now().Unix(), auth.AccessExpire, userId)
}

5. 测试中间件

在这里插入图片描述
访问 login 接口后,在控制台打印日志。日志是由路由中间件打印的。

6. 全局中间件

上面引入的路由中间件是,可以针对部分路由起作用,如果想要对所有路由起作用,可以使用全局中间件。
在 userapi/internal/handler/routers.go文中,加入一行代码:
在这里插入图片描述
这样引入的中间件,就是全局中间件,对所有路由都会生效。

自定义错误

1. 引出问题

  1. 在 userapi/internal/logic/userapilogic.go 文件的 GetUser 方法加一段逻辑
    在这里插入图片描述
  2. 测试
    在这里插入图片描述
    用postman 测试后,结果如图。显然,很多情况下,我们不想直接获取到这种形式的错误。更愿意拿到一个 json 格式的错误,包括错误代码,错误内容。这样更容易处理。

2. 在 userapi/internal 创建 errorx 目录,来管理错误

在 userapi/internal/errorx 目录创建一个 error.go 文件

package errorx

var ParamsError = New(1101, "parameter error")

type BizError struct {
	Code int    `json:"code"`
	Msg  string `json:"msg"`
}

func New(code int, msg string) *BizError {
	return &BizError{
		Code: code,
		Msg:  msg,
	}
}

func (e *BizError) Error() string {
	return e.Msg
}

type ErrorResponse struct {
	Code int    `json:"code"`
	Msg  string `json:"msg"`
}

func (e *BizError) Data() *ErrorResponse {
	return &ErrorResponse{
		e.Code,
		e.Msg,
	}
}

该文件定义了错误码和错误内容。

3. 修改 userapi/internal/logic/userapilogic.go 文件

在这里插入图片描述
返回错误的时候,返回我们上一步自定义的错误。

4. 修改 userapi/userapi.go 文件,增加错误处理逻辑

在这里插入图片描述
增加了,错误处理的逻辑。

5. 测试

在这里插入图片描述
这样,就获取到 json 格式的错误数据。

goctl 命令

1. 源码文件生成格式

goctl api go -api userapi.api -dir ./gen 

这种方式生成的代码,文件名称是所有字母全小写。有时候我们需要不同的命名格式,比如有些团队或个人喜欢驼峰命名方式,有些喜欢snake的形式

goctl api go -api userapi.api -dir ./gen -style go_zero 

这种方式生成的文件名称是 snake 形式。

goctl api go -api userapi.api -dir ./gen -style goZero 

这种命名方式是驼峰命名方式

2. 生成 proto 文件

goctl rpc template -o=user.proto

利用模板生成 .proto 文件,这样在开发过程中,有一个基础模块。在这个目标上进行修改,相对更方便一点。

3. 生成 rpc 服务代码

goctl rpc protoc user.proto --go_out=. --go-grpc_out=. --zrpc_out=.

之前,我们项目的代码就是靠这种方式生成的。

4. 生成 model 代码

goctl model mysql ddl -src="./*.sql" =dir="./sql/model" -c

根据数据库的 ddl 语句,生成模型代码。生成的这部分代码,可以摘取部分使用,减少工作量。

5. 生成 dockerfile

goctl docker -go hello.go

hello.go 是启动类。

6. 生成 k8s 只要清单

goctl kube deploy -name redis -namespace adhoc -image redis:6-alpine -o redis.yaml -port 6379

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/646928.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

返回枚举类给前端

1. 前言 在实际开发过程中,前端的下拉框或者单选按钮的内容通常的需要和后端匹配的,故一般会由后端将下拉框的内容或单选框的内容传给前端,而这些内容在后端一般是由枚举类存储的,如果后端直接返回枚举类,返回结果将会…

民国漫画杂志《时代漫画》第24期.PDF

时代漫画24.PDF: https://url03.ctfile.com/f/1779803-1248635000-177187?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

基于YOLOv8的车牌检测与识别(CCPD2020数据集)

前言 本篇博客主要记录在autodl服务器中基于yolov8实现车牌检测与识别,以下记录实现全过程~ yolov8源码:GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite 一、环境配置 …

怎么在网上赚点零花钱?分享十个正规的赚钱兼职平台

亲爱的朋友们,大家好!今天要和大家聊聊一个让人兴奋的话题——网上赚钱。在这个互联网飞速发展的时代,网上赚钱已经不再是遥不可及的梦想。如果你正想在网上赚点零花钱,那么这篇文章你可不能错过! 在这个信息爆炸的时代…

ASP.NET 代码审计

ASP.NET 官方文档 名词解释 IIS(Internet Information Services) IIS 是微软开发的一款 Web 服务器软件,用于在 Windows 服务器上托管和提供Web应用程序和服务。它支持 HTTP、HTTPS、FTP、SMTP 等多种协议,主要用于&#xff1a…

HTML与CSS的学习

什么是HTML,CSS&#xff1f; HTML(HyperText Markup Language):超文本标记语言。 超文本:超越了文本的限制&#xff0c;比普通文本更强大。除了文字信息&#xff0c;还可以定义图片、音频、视频等 标记语言:由标签构成的语言 >HTML标签都是预定义好的。例如:使用<a>…

Jupyter Lab 软件安装与使用

软件简介 Jupyter Lab 软件是一个基于web 的交互式开发环境&#xff0c;集成了代码编辑器、终端、文件管理器等功能&#xff0c;使得开发者可以在一个界面中完成各种任务。JupyterLab是Jupyter Notebook的全面升级&#xff0c;是一个集文本编辑器、终端以及各种个性化组件于一…

STL库 —— unordered_set与unordered_map的封装

这里要对 unordered_set 与 unordered_map 进行封装&#xff0c;封装时使用的是上一篇中学的 HashBucket 。不仅要完成封装&#xff0c;同时要写入迭代器。 一、HashBucket 的修改 1.1 节点的修改 T 首先来认识一下使用 unordered_set 和 ordered_map 时的区别&#xff1a; …

头歌结构化分析方法-数据流图

第1关&#xff1a;数据流图-画出外部实体 第2关&#xff1a;数据流图-画出加工 第3关&#xff1a;数据流图-画出数据存储 第4关&#xff1a;数据流图-画出数据流 第5关&#xff1a;数据流图-机票预定系统

纯电动汽车硬件在环测试

纯电动汽车硬件在环测试技术研究综述 1、新能源汽车概述 随着新能源汽车“电动化、智能化、网联化、共享化”进程的不断推进&#xff0c;新能源汽车的整体性能得到显著提高&#xff0c;纯电动汽车已经逐渐走进大众视野&#xff0c;消费者对于新能源汽车的认可度和购买欲望也稳…

每日一题---有效的括号问题

文章目录 前言1.题目以及分析2.参考代码 前言 前面我们学习了栈的相关操作&#xff0c;现在我们做一道题&#xff0c;进行巩固 Leetcode—有效的括号 1.题目以及分析 这道题就可以使用栈进行操作&#xff0c;因为把最左边的括号当成栈底&#xff0c;最右边的是栈顶&#xff0c…

深入了解 Golang 多架构编译:交叉编译最佳实践

随着软件开发领域的不断发展&#xff0c;我们面临着越来越多的挑战&#xff0c;其中之一是如何在不同的平台和架构上部署我们的应用程序。Golang&#xff08;Go&#xff09;作为一种现代化的编程语言&#xff0c;具有出色的跨平台支持&#xff0c;通过其强大的多架构编译功能&a…

开源大模型与闭源大模型,你更看好哪一方?

开源大模型与闭源大模型&#xff0c;你更看好哪一方&#xff1f; 简介&#xff1a;评价一个AI模型“好不好”“有没有发展”&#xff0c;首先就躲不掉“开源”和“闭源”两条发展路径。对于这两条路径&#xff0c;你更看好哪一种呢&#xff1f; 1.方向一&#xff1a;数据隐私 …

C语言PTA练习题(编程求1+3+5+...+n,编程求n的阶乘,爬楼梯,爬楼梯(扩展),猴子吃桃,猴子吃桃(扩展),求算式前n项的和,汉诺塔游戏)

7-1 编程求135...n 输入一个正整数n&#xff0c;编程求135...n 要求&#xff1a;用递归完成。 输入格式: 输入一行&#xff0c;只有一个整数n (1<n<9999) 这里n为奇数。 输出格式: 一个正整数&#xff0c;表示结果。 输入样例: 在这里给出一组输入。例如&#xf…

使用libtorch加载YOLOv8生成的torchscript文件进行目标检测

在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集&#xff0c;使用 LabelMe 工具进行标注&#xff0c;然后使用 labelme2yolov8 脚本将json文件转换成YOLOv8支持的.txt文件&#xff0c;并自动生成YOLOv8支持的目录结构&#xff0c;包括melon.yaml文件&#xff0c;其内容…

我让gpt4o给我推荐了一千多次书 得到了这些数据

事情是这样的&#xff0c;我们公司不是有个读书小组嘛&#xff0c;但是今年大家都忙于工作&#xff0c;忽视了读书这件事&#xff0c;所以我就想着搞个群机器人&#xff0c;让它明天定时向群里推荐一本书&#xff0c;用来唤起大家对读书的兴趣。但在调试的过程中就发现gpt4o老喜…

基于Vue的前端自定义询问弹框与输入弹框组件的设计与实践

基于Vue的前端自定义询问弹框与输入弹框组件的设计与实践 摘要 随着技术的不断进步&#xff0c;前端开发面临越来越多的挑战&#xff0c;其中之一就是如何有效管理复杂的业务逻辑和用户体验。传统的整块应用开发方式在面对频繁的功能变更和用户体验优化时&#xff0c;往往显得…

粤嵌—2024/5/20—三角形最小路径和(✔)

代码实现&#xff1a; int minimumTotal(int **triangle, int triangleSize, int *triangleColSize) {if (triangleSize 1) {return triangle[0][0];}for (int i 1; i < triangleSize; i) {for (int j 0; j < triangleColSize[i]; j) {int x i - 1;int y1 j - 1, y2…

【how2j java应用】

[Log4j] 演示如何使用log4j进行日志输出 1.导入jar包 2.使用Log4j 3.代码说明 LOG4J 配置讲解 在src目录下添加log4j.properties文件 说明 log4j.xml 除了使用log4j.properties&#xff0c;也可以使用xml格式进行配置。 [junit] 通过main方法来进行测试&#xff1a;如果…