【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范

本文讲述了作者在使用Go-Zero开发过程中遇到的问题,即API查询数据库信息失败,通过排查发现是由于API和RPC文件的结构不一致导致的。作者给出了正确的proto和api文件编写规范,强调了在返回单个信息时避免额外嵌套结构的重要性。
摘要由CSDN通过智能技术生成

【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范

大家好 我是寸铁👊
总结了一篇测试API查询信息无法返回数据库信息与api、rpc文件编写规范的文章✨
喜欢的小伙伴可以点点关注 💝

在这里插入图片描述

问题背景

大家好,我是寸铁!今天在今天在编写gozeroapirpc时,出现了个小bug,下面我们一起来看一下这个bug是什么?


今天在编写gozeroapirpc进行测试的时候,想要通过id去调数据库的数据。
测试结果如下:
很明显,并没有成功拿到数据库的数据。

在这里插入图片描述


数据库是有对应数据的。

在这里插入图片描述

排查问题

可以从rpcapi层的代码中打印到数据库的数据,说明编写逻辑是没问题的。

rpc层打印信息如下:
在这里插入图片描述


api层打印信息如下:

在这里插入图片描述

编写apirpc层的逻辑赋值常用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查询数据库的信息,不需要再套多一层。

主要是最开始的protoapi文件的编写问题,不要再套多一层,直接就是返回需要返回的信息即可。


proto文件如下编写为正确规范:

在这里插入图片描述


api文件编写正确规范如下:

在这里插入图片描述

如下编写错误,这里不要再套多一层!!!

在这里插入图片描述


修改完文件后,重新用goctl重新生成apirpc层代码

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

  • 36
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寸 铁

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值