查看原文
其他

写了个数据查询为空的 Bug,你会怎么办?

鱼皮 程序员鱼皮 2024-01-21

大家在开发时,遇到的一个典型的 Bug 就是:为什么数据查询为空?

对应的现象就是:前端展示不出数据、或者后端查询到的数据列表为空。

遇到此类问题,其实是有经典的解决套路的,下面鱼皮给大家分享如何高效解决这个问题。

只需 4 个步骤:

解决步骤

1、定位问题边界

首先要定位数据查询为空的错误边界。说简单一点,就是要确认是前端还是后端的锅。

要先从请求的源头排查,也就是前端浏览器,毕竟前端和后端是通过接口(请求)交互的。

在浏览器中按 F12 打开浏览器控制台,进入网络标签,然后刷新页面或重新触发请求,就能看到请求的信息了。

选中请求并点击预览,就能看到后端返回结果,有没有返回数据一看便知。

如果发现后端正常返回了数据,那就是前端的问题,查看自己的页面代码来排查为什么数据没在前端显示,比如是不是取错了数据的结构?可以多用 debugger 或 console.log 等方式输出信息,便于调试。

星球同学可以免费阅读前端嘉宾神光的《前端调试通关秘籍》:https://t.zsxq.com/13Rh4xxNK

如果发现后端未返回数据,那么前端需要先确认下自己传递的参数是否正确。

比如下面的例子,分页参数传的太大了,导致查不到数据:

如果发现请求参数传递的没有问题,那么就需要后端同学帮忙解决了。

通过这种方式,直接就定位清楚了问题的边界,高效~

2、后端验证请求

接下来的排查就是在后端处理了,首先开启 Debug 模式,从接受请求参数开始逐行分析。

比如先查看请求参数对象,确认前端有没有按照要求传递请求参数:

毕竟谁能保证我们的同事(或者我们自己)不是小迷糊呢?即使前端说自己请求是正确的,但也必须要优先验证,而不是一上来就去分析数据库和后端程序逻辑的问题。

验证请求参数对象没问题后,接着逐行 Debug,直到要执行数据库查询。

3、后端验证数据库查询

无论是从 MySQL、MongoDB、Redis,还是文件中查询数据,为了理解方便,我们暂且统称为数据库。

上一步中,我们已经 Debug 到了数据库查询,需要重点关注 2 个点:

1)查看封装的请求参数是否正确

对于 MyBatis Plus 框架来说,就是查看 QueryWrapper 内的属性是否正确填充了查询条件

2)查看数据库的返回结果是否有值

比如 MyBatis Plus 的分页查询中,如果 records 属性的 size 大于 0,表示数据库返回了数据,那么就不用再排查数据库查询的问题了;而如果 size = 0,就要分析为什么从数据库中查询的数据为空。

这一步尤为关键,我们需要获取到实际发送给数据库查询的 SQL 语句。如果你使用的是 MyBatis Plus 框架,可以直接在 application.yml 配置文件中开启 SQL 语句日志打印,参考配置如下:

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

然后执行查询,就能看到完整的 SQL 语句了:

把这个 SQL 语句复制到数据库控制台执行,验证下数据结果是否正确。如果数据库直接执行语句都查不出数据,那就确认是查询条件错误了还是数据库本身就缺失数据。

4、后端验证数据处理逻辑

如果数据库查询出了结果,但最终响应给前端的数据为空,那么就需要在数据库查询语句后继续逐行 Debug,验证是否有过滤数据的逻辑。

比较典型的错误场景是查询出的结果设置到了错误的字段中、或者由于权限问题被过滤和脱敏掉了。

最后

以后再遇到数据查询为空的情况,按照以上步骤排查问题即可。排查所有 Bug 的核心流程都是一样的,先搜集信息、再定位问题、最后再分析解决。

👇🏻 点击下方阅读原文,获取鱼皮往期编程干货。

往期推荐

新项目来咯!

阿里终于放大招了?!

老板说我能力不行,怎么办?

offer 选择难?说说我的 2 个思考

Git 提交竟然还能这么用?

语雀 P0 事故复盘,这 9 个字亮了!

继续滑动看下一个

写了个数据查询为空的 Bug,你会怎么办?

鱼皮 程序员鱼皮
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存