这个问题有很多朋友都有遇到过,我这个问题出现的原因有点奇葩,在这里记录一下。
我的功能是输入【产品】之后,后台能够查询出【标签】,加载到标签下拉框。用户可以从结果中选择或者自己输入。
问题
一个很奇怪的现象,就是输入产品,点击标签下拉框,要输入的时候,有时会报错Uncaught TypeError: Cannot read property ‘toLowerCase‘ of undefined。有时不会报。
本地环境和测试环境没有报错,正式环境报错了。为什么呢?
排查
- 我们要知道出问题的【产品】是哪些,为什么有的会有问题,有些又没有
- 在出错的时候,浏览器当前页面,当我通过产品查到标签,加载到下拉框的时候,按F12,看network返回的是什么?没有错的时候又返回的是什么?
接下来,看到两种情况
1)报错的
data:[
tags:[{checked:false}[
]
2)不报错的
data:[
tags:[]
] - 所以就是后端返回的结果有问题!我把有问题的产品条件,拿去数据库查询。发现看起来好像没问题。
sql语句:
select distinct tags from product where id in
(:id)
查询结果
tags |
---|
细问一下同事,这个产品的输入值是怎么来的,他说product表里有。那有的话为什么查出来是空?空的不应该返回tags:[]吗?哪里来的checked:false?我们没有这个字段啊。
select * from product where id=‘123’
发现问题了!它的tags是空值……
本地环境和测试环境不报错,是因为它们的数据库这个字段都有值,数据不一样,情况也就不一样。
所以查询出来有没有记录,和字段有没有值还是要区分一下的,毕竟我们还是distinct一个字段。
解决与总结
问题点找到了之后,就要解决。
- 解决办法1:java代码for循环判断查出来的结果是否是个空值,需要重新打包上版
- 解决办法2:修改sql,不查询空的tags
select distinct tags from product
where id in (:id)
and tags is not null
【总结】:
一般只查询一个字段,或者有distinct的,记得要加上不为空的条件