网页提示null,网页说白了就是提示后台没给你返回数据,或者返回了个空值。什意思你看见这两个字母的网页时候,八成是提示前端代码在拿一个不存在的东西硬干活。
我上周调试一个订单页面就撞上这事。什意思用户点“查看详情”,网页页面白花花一片,提示控制台里躺着个红字:Cannot read properties of null。什意思查了半天,网页接口返回的提示JSON里压根没有detail这个字段,前端却直接去读data.detail.name。什意思null就是网页那个“没有”,你非要往没有上取东西,提示浏览器只能甩脸子。什意思
还有一种常见情况,是数据库里字段本身存的就是NULL。比如用户没填昵称,你存了个NULL,页面渲染时直接输出{ { user.nickname }},有些框架会显示成空字符串,有些就直接给你弹个null。这不算bug,算数据边界没处理干净。真正恶心的是那种接口偶尔返回null,偶尔返回正常数据——你刷新三次,两次好的一次坏的,这种间歇性抽风最让人抓狂。
别急着怪后端。有时候是前端自己把变量搞丢了。比如异步请求还没回来,你就急着渲染,这时候数据还是undefined,你拿undefined去当对象用,系统给你报的错可能也是null相关。我见过初级工程师写的代码,let res = await fetch(...)后面直接res.data.list,结果fetch失败了,res是null,整页崩掉。
处理办法其实就三板斧。第一,接口文档写清楚哪些字段可能为空,前端做防御性判断,if (data && data.list)这种老土写法永远不过时。第二,后端别偷懒,该给默认值就给默认值,空字符串也好,空数组也好,别动不动甩个null让前端猜。第三,你自己调试的时候,打开开发者工具,看Network面板里接口到底返回了什么——很多时候真相就在那一行响应里。
顺带说个反直觉的事。有些null其实是故意的。比如你删除一条评论,后端返回{ code: 200, data: null },意思是“删干净了,没有后续数据”。这时候前端如果拿data去渲染,那是你的问题,不是后端的。你得看code,别死盯着data。
写代码这行,null就像厨房里的盐罐子空了——你炒菜发现没盐,不是锅的错,是你没提前检查调料。网页提示null,就是在喊:我这儿缺东西,你补上再让我干活。你非不补,它就只能罢工给你看。