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

场景

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

xxx is not fuction

Cannot read property xxxx of undefined

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

常见方式

 1 // response 是来自接口的数据
 2 const response = {
 3     code: 200,
 4     msg: ‘message‘,
 5     data: {
 6         total: 100,
 7         page: 1,
 8         pageSize: 10,
 9         content: []
10     }
11 }
12
13 const goodsList = response.data.content.forEach(() => {})
14 const total = response.data.total

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

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

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

简单改进

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

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

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

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

1 const response = {
2     data: null
3 }

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

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

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

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

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

进一步改进

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

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

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

下面是过滤数据的函数

 1 // 把获取到的数据过滤一遍
 2 const replaceNull = (obj) => {
 3     for (let key in obj) {
 4         switch (Object.prototype.toString.call(obj[key]).slice(8, -1)) {
 5             case ‘Object‘:
 6                 replaceNull(obj[key])
 7                 break;
 8             case ‘Array‘:
 9                 for (let i = 0; i < obj[key].length; i++){
10                     replaceNull(obj[key][i])
11                 }
12                 break;
13             default:
14                 if (obj[key] === null) obj[key] = undefined;
15         }
16     }
17 }

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

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

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

结束语

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

原文地址:https://www.cnblogs.com/ly0612/p/11988543.html

时间: 2024-11-11 07:57:06

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

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

@Controller @RequestMapping("/view")//请求父路径 public class GoodsController { @RequestMapping("/goodsReturnReq.do")//请求子路径 public String goodsReturnReq(Goods goods,HttpServletRequest request){ System.out.println("goodsReturnReq:"

如果参数number包含Null,则返回Null;如果参数character包含Null

VBA字符串处理大全 1 VBA中的字符串2 VBA中处理字符串的函数2.1 比较字符串2.2 转换字符串2.3 创建字符串2.4 获取字符串的长度2.5 格式化字符串2.6 查找字符串2.7 提取字符/字符串2.8 删除空格2.9 返回字符代码2.10 返回数值代表的相应字符2.11 使用字节的函数2.12 返回数组的函数2.13 连接字符串2.14 替换字符串2.15 反向字符串==================================================== 1 VB

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

在使用express做后端,前端使用fetch API来请求后端时,一般都是用 JSON 数据进行通信的. 下面是一个简单的例子: 前端: if (up) { var passwordAgain = this.state.passwordAgain; postObj.passwordAgain = passwordAgain; console.log('注册', userName, password, passwordAgain) fetch("/register", { method

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

以随便一个类为例子:这个例子是查询企业主营类别前5事项 (1)后端将结果绑定到param中,然后将结果以为json的格式返回到前端 /** * 查询企业主营类别前5事项 * @param request * @param response * @param config * @throws Exception * @author hongxy * 2017年6月1日下午2:21:14 */ public void getEnterpriseMainCategory(HttpServletRequ

对后端返回的数据进行适配

为什么要做接口适配 同一个功能,后端返回的数据结构经常变动,导致前端写的逻辑也得相应的修改,而接口适配就是为了解决此问题,不管后端接口怎么变动,前端只需要调整适配的数据部分,而不会对页面已有逻辑造成影响. 请求接口的适配 拿登录功能来说,有账号密码字段. 请求登录(以前) export const Login = data => { return ajax.post('/sso/login', { username: data.username, password: data.password

前端接收后端返回的文件流导出Excel

需求:接收后端返回的文件流导出Excel 自己项目中遇到过,亲测有效 情况二使用过程中解决的问题: 1.直接接受的文件流下载格式为txt且乱码.需要通过 下面这句代码来转成Excel: let url = new Blob([xmlHttp.response], { type: 'application/vnd.ms-excel' }); 2.文件名乱码,显示数字单词组成的随机字符串.需要后端在header中返回文件名,转义获取 //文件名 link.download = decodeURICo

[后端人员耍前端系列]KnockoutJs篇:使用WebApi+Bootstrap+KnockoutJs打造单页面程序

一.前言 在前一个专题快速介绍了KnockoutJs相关知识点,也写了一些简单例子,希望通过这些例子大家可以快速入门KnockoutJs.为了让大家可以清楚地看到KnockoutJs在实际项目中的应用,本专题将介绍如何使用WebApi+Bootstrap+KnockoutJs+Asp.net MVC来打造一个单页面Web程序.这种模式也是现在大多数公司实际项目中用到的. 二.SPA(单页面)好处 在介绍具体的实现之前,我觉得有必要详细介绍了SPA.SPA,即Single Page Web App

[后端人员耍前端系列]AngularJs篇:30分钟快速掌握AngularJs

一.前言 对于前端系列,自然少不了AngularJs的介绍了.在前面文章中,我们介绍了如何使用KnockoutJs来打造一个单页面程序,后面一篇文章将介绍如何使用AngularJs的开发一个单页面应用程序.在开始使用AngularJs开发SPA之前,我觉得有必要详细介绍下AngularJs所涉及的知识点.所有也就有了这篇文章. 二.AngularJs介绍 AngularJS是Google推出的一款Web应用开发框架.它提供了一系列兼容性良好并可扩展的服务,包括数据绑定.DOM操作.MVC和依赖注

localStorage + 配置url 前后端分离之前端先行

关于localStorage和sessionStorage的基础说明说明网上一大堆,这里说下自己的一个亲身应用. 使用localStorage配置url,使前端代码更方便适配测试和真实环境: 大家都知道如果前后端分离的话,往往很多时候可以前端先行,不依赖于后台(接口得提前定义好). 但是存在两个问题: 1.前后端分离后前端虽然不依赖于后台,但是依赖ajax返回的结果 2.往往自己造的mock地址跟真是环境的url地址不一致,如果写死了,则需要改动很大一片 先说第二个问题,之前在一个项目上看到的时