【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范
大家好 我是寸铁👊
总结了一篇测试API查询信息无法返回数据库信息与api、rpc文件编写规范的文章✨
喜欢的小伙伴可以点点关注 💝
问题背景
大家好,我是寸铁!今天在今天在编写gozero
的api
和rpc
时,出现了个小bug
,下面我们一起来看一下这个bug
是什么?
今天在编写gozero
的api
和rpc
进行测试的时候,想要通过id
去调数据库的数据。
测试结果如下:
很明显,并没有成功拿到数据库的数据。
数据库是有对应数据的。
排查问题
可以从
rpc
、api
层的代码中打印到数据库的数据,说明编写逻辑是没问题的。
rpc
层打印信息如下:
api
层打印信息如下:
编写
api
、rpc
层的逻辑赋值常用copier.Copy(resp , res)
函数。
但是在这一处copier.Copy(resp , res)
时候发现resp
打印内容是db
设置的默认值,这就说明调用这个函数时,无法成功赋值!
那为什么赋值不成功呢?
我们先来看一下函数的底层结构是怎么样的?
进入函数的表层,发现主要是传入两个
参数。
一个是要
目标数据
(你想赋值的位置),一个是数据来源
(你要赋值的数据),这两个都是接口
类型,说明可以传入任意类型
的参数。
再进入copier
函数的底层封装实现看看:
本质是基于反射实现的,对数据的各种类型和数值进行处理。
由于篇幅过长,感兴趣的同学可以去阅读源码
好,到了这里我们需要思考一个问题,很明显是调用Copy
函数赋值不成功,那么这里就需要对传入的参数进行思考。
- 到底是参数传反了?
- 还是说传入的参数不对?
- 还是说传入的参数结构有要求?
回头看看这个函数,逐个对猜想进行排查。
排查如下:
-
第一种,位置不对,这里的
res
是从数据库查到的数据,再把他赋值给resp
响应,这是没问题的 -
第二种,
res
是我从数据库查到的数据,resp
是赋值的响应信息,这两部分都是结构体,并且语法也通过了,这也是没问题的。 -
第三种,传入的参数的
结构
对不上,或者说错乱
。
在排查了前两种可能性后,只有第三种的概率比较大。
再使用一下参数,发现还能够通过
res
点出Goods
,这说明之前编写的rpc
层的proto
文件和api
层的api
文件的编写结构不一致
或者说嵌 套
了导致调用的混乱
。
那就需要重新回到一开始的rpc
层的proto
文件和api
层的api
文件编写上了!
解决问题
这里是根据
id
查询数据库的信息,不需要再套多一层。
主要是最开始的proto
、api
文件的编写问题,不要再套多一层,直接就是返回需要返回的信息即可。
proto
文件如下编写为正确规范:
api
文件编写正确规范如下:
如下编写错误,这里不要再套多一层!!!
修改完文件后,重新用goctl
重新生成api
、rpc
层代码
resp
的内容如下:
res
的内容如下:
重新测试
重启服务后,测试结果如下:
这样就成功拿到信息啦!
总结回顾
-
如果只是返回根据
id
查询单个的信息,不要套一层结构体,直接把商品的信息返回出去,不要再套一层,否则在后面的copier
函数很混乱,导致结构体赋值失败
。 -
如果要返回查询的信息的
列表
时,可以选择嵌套多一层。
注意:编写文件的规范取决于你的
需求
和生产环境
,使用时可以适当
参考本文编写规范。
往期好文💕
保姆级教程
【保姆级教程】Windows11下go-zero的etcd安装与初步使用
【保姆级教程】Windows11安装go-zero代码生成工具goctl、protoc、go-zero
【Go-Zero】手把手带你在goland中创建api文件并设置高亮
报错解决
【Go-Zero】Error: user.api 27:9 syntax error: expected ‘:‘ | ‘IDENT‘ | ‘INT‘, got ‘(‘ 报错解决方案及api路由注意事项
【Go-Zero】Error: only one service expected goctl一键转换生成rpc服务错误解决方案
【Go-Zero】【error】 failed to initialize database, got error Error 1045 (28000):报错解决方案
【Go-Zero】Error 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)报错解决方案
【Go-Zero】type mismatch for field “Auth.AccessSecret“, expect “string“, actual “number“报错解决方案
【Go-Zero】Error: user.api 30:2 syntax error: expected ‘)‘ | ‘KEY‘, got ‘IDENT‘报错解决方案
【Go-Zero】Windows启动rpc服务报错panic:context deadline exceeded解决方案
Go面试向
【Go面试向】defer与time.sleep初探
【Go面试向】defer与return的执行顺序初探
【Go面试向】Go程序的执行顺序
【Go面试向】rune和byte类型的认识与使用
【Go面试向】实现map稳定的有序遍历的方式