场景

我们在开发过程当中,总是会遇到因为数据原因,导致使用数组方法或者获取对象属性的时候报错。

xxx is not fuction

Cannot read property xxxx of undefined

因为这些错误,会导致直接页面打不开,所以我们一般会做一些容错处理,从而让页面可以正常打开。例如:&& 、三元运算符,甚至有时会看到 if 语句来处理。

常见方式

 // response 是来自接口的数据
const response = {
code: 200,
msg: 'message',
data: {
total: 100,
page: 1,
pageSize: 10,
content: []
}
} const goodsList = response.data.content.forEach(() => {})
const total = response.data.total

为了保证取data、content属性和使用forEach不报错,可能会这样做

 const goodsList = response.data && response.data.content && response.data.content.forEach(() => {})
const total = response.data && response.data.total

这样就初步完成了数据容错,但是代码过于冗余可读性差,而且 total 的值还会可能变成 Boolean 类型。

简单改进

只需要简单的两个处理,一个是解构,一个是给默认值

 const { data = {} } = response
const { constent = [], total = [] } = data
goodsList.forEach(() => {})

解构是非常有必要的,增加代码可读性和扁平化数据

不过,但这里又有了新的问题。这个时候如果我得到数据如下的样子:

 const response = {
data: null
}

那么解构就会报错 Cannot destructure property content of 'undefined' or 'null'

默认值生效的条件是,对象的属性值严格等于undefined

上面代码中,属性data等于null,因为null与undefined不严格相等,所以是个有效的赋值,导致默认值 {} 不会生效。实际就成了如下的样子:

 const { constent = [], total = [] } = null 

因此我们得保证拿到的数据不能存在null,不然上面的代码就没意义了。

进一步改进

你可能在想和后端约定好不返回 null 就好了

但是不能过分相信外部数据,包括约定之后的

这种情况其实可以在封装axios 或者fetch的时候,在里面添加一个过滤的函数,把从接口拿到的数据过滤一下,过滤掉值为 null 的数据,或者是把为 null 的数据重新赋值为 undefined。

下面是过滤数据的函数

 // 把获取到的数据过滤一遍
const replaceNull = (obj) => {
for (let key in obj) {
switch (Object.prototype.toString.call(obj[key]).slice(8, -1)) {
case 'Object':
replaceNull(obj[key])
break;
case 'Array':
for (let i = 0; i < obj[key].length; i++){
replaceNull(obj[key][i])
}
break;
default:
if (obj[key] === null) obj[key] = undefined;
}
}
}

过滤之后,这个时候这种写法就没问题了

 const { data = {} } = response
const { constent = [], total = [] } = data
goodsList.forEach(() => {})

当然如果你们有node作为中间层,前端视图层是可以放心的使用解构默认值的,比如 graphQl 这种。

结束语

前端数据容错处理是必须的,不能期待外部数据的格式就是自己想要的。不知道大家平时都是怎么处理的。

后端返回null,前端怎么处理?数据容错——不用过分相信外部数据的更多相关文章

  1. 数据返回(数据共享,即从后端返回到前端调用,四种(requesst、ModelAndView、Model、Map))

    @Controller @RequestMapping("/view")//请求父路径 public class GoodsController { @RequestMapping ...

  2. java加载外部文件数据到代码中:外部数据文件放到jar包中,调用方法getResourceAsStream

    任务要将数据文件geo.txt加载进行.因为是别人写的总体项目,不能乱动位置.只能将geo.txt打包到jar中某目录.比如,放到.class文件下怎么加载:http://riddickbryant. ...

  3. 【翻译】Flink 异步I / O访问外部数据

    本文来自官网翻译: Asynchronous I/O for External Data Access 需要异步I / O操作 先决条件 异步I / O API 超时处理 结果顺序 活动时间 容错保证 ...

  4. 关于JavaDate数据返回到前端变数字的问题(并引申到前后端时间的传输)

    不知道为什么,前端显示的所有数据项都没有错,就只有时间那一项很奇怪,是一串数字,而且这个数字在数据库怎么都找不到…… 然后我在后端从service到controller都debug了一遍,发现数据都没 ...

  5. [前后端分离项目]thinkphp返回给前端数据为字符串

    写在前面:现在项目大多是采用前后端分离的模式进行开发,这种模式下的开发大大的提高了工作效率,而进行前后端数据交互传输的格式基本以json为主,毕业设计中兼顾前端开发和后端开发(后端小白一个),前端业务 ...

  6. 后端返回值以json的格式返回,前端以json格式接收

    以随便一个类为例子:这个例子是查询企业主营类别前5事项 一.以json数组的格式返回到前端中 (1)后端将结果绑定到param中,然后将结果以为json数组的格式返回到前端 /** * 查询企业主营类 ...

  7. express后端和fetch前端的json数据传递

    在使用express做后端,前端使用fetch API来请求后端时,一般都是用 JSON 数据进行通信的. 下面是一个简单的例子: 前端: if (up) { var passwordAgain = ...

  8. 微信小程序POST请求参数传递不到后台, 前台获取不到后端返回的数据, 以及 post 请求返回 404 但后台能收到数据

    1 微信小程序POST请求参数传递不到后台 需要在微信请求 wx.request 改变默认 header 配置为如下 wx.request({ url: 'test.php', //仅为示例,并非真实 ...

  9. django学习-16.返回给前端页面数据为json数据类型的3种方案

    目录结构 1.前言 2.JsonResponse类的源码简单分析 2.1.JsonResponse类的源码如下所示 2.2.JsonResponse类的构造函数里的每个入参的大概含义和作用 3.[方案 ...

随机推荐

  1. apt-get原理

    apt-get 而这个步骤全要用户亲力亲为可能又有些麻烦,懒是科技发展的重要推动力.所以软件厂商自己编译好了很多二进制文件,只要系统和环境对应,下载之后就能直接安装. 但是如果下载了很多软件我想要管理 ...

  2. 移除 DevExpress 的 XtraForm 标题文字阴影

    问题 在使用 DevExpress 开发 WinForm 程序时,我是使用的默认皮肤进行开发.但客户要求标题栏背景色改为蓝色,标题文字颜色改为白色. 改颜色比较简单,参考了 DevExpress Su ...

  3. PHP中RBAC权限管理

    1.RBAC概念和原理          RBAC:全称叫做Role-Based Access Control,中文翻译叫做基于角色的访问控制.其主要的作用是实现项目的权限控制.            ...

  4. Java每日一面(Part1:计算机网络)[19/11/02]

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 1.TCP的滑动窗口 1.1 RTT和RTO的区别 ​ RTT:发送一个数据包到收到对应的ACK,所花费的时间 ​ RTO:重传时间间隔,TCP在发 ...

  5. Scrapy中response属性以及内容提取

    一.属性 url :HTTP响应的url地址,str类型 status:HTTP响应的状态码, int类型 headers :HTTP响应的头部, 类字典类型, 可以调用get或者getlist方法对 ...

  6. 松软科技web课堂:字符串方法和属性

    字符串方法帮助您处理字符串. 字符串方法和属性 原始值,比如“Bill Gates”,无法拥有属性和方法(因为它们不是对象). 但是通过 JavaScript,方法和属性也可用于原始值,因为在执行方法 ...

  7. ThinkPHP6框架的下载与安装

    thinkphp6发布也有一段时间了,相对来说比较稳定,是时候学习一下thinkphp6框架,提前学习,到正式发布的时候,可以直接拿来做正式的项目,先人一步.thinkPHP6.0在5.1的基础上对底 ...

  8. ios中仿蚂蚁森林动画效果

    参考链接:https://www.jianshu.com/p/0ba9d80f8e77 demo下载链接:https://gitee.com/ovix/TreeWithRandomFruitBtn

  9. smobiler自适应不同手机分辨率

    在smobiler中可以通过相对布局或者绝对布局实现自适应不同手机分辨率. 例如实现下图中的布局,图中的布局实际可以分成3个部分,部分1可以使用Title控件,部分2可以使用Panel(在Panel中 ...

  10. Fundebug前端异常监控插件更新至2.0.0,全面支持TypeScript

    摘要: 是时候支持TS了! Fundebug前端异常监控服务 Fundebug提供专业的前端异常监控服务,我们的插件可以提供全方位的异常监控,可以帮助开发者第一时间定位各种前端异常,包括但不限于Jav ...