【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稳定的有序遍历的方式