有没有这样一个 lib,可以帮 js 前端“清理”后台 api 返回的数据结构?

2017-12-20 19:56:39 +08:00
 wxsm

比如说,按照约定后台应该返回这样的一个数据结构:

{
  a: {
    b: [] // 某数组
  },
  c: '某字符串'
}

但是有时候事与愿违,团队开发者一多,后台往往会返回缺斤少两或者奇怪的东西,导致错误,比如

{
  a: null,
  c: null
}

或者:

{
  a: {
    b: null
  }
}

我知道可以通过逐个字段判空来解决,但这太麻烦了,而且一不小心就漏掉了什么地方。有没有一种工具,可以对这样的数据按照约定结构进行补全呢?

比如:

6145 次点击
所在节点    程序员
50 条回复
janxin
2017-12-20 22:08:36 +08:00
@wanganjun 因为 graphql 没有什么收益,除了前端偷懒以外
kaneg
2017-12-20 22:09:37 +08:00
把后端返回的 json 合并到定义的默认 json,是不是就得到楼主想要的结果了?
aegisho
2017-12-20 22:14:40 +08:00
1.明确规范,出 bug 算到后端的责任
2.老老实实写防御性代码
3.考虑类似 json schema 校验补全
4. 我能(要)打十个
wxsm
2017-12-20 22:17:34 +08:00
@jzhang 看了一圈文档,貌似没有发现对缺失值的处理办法?

@isbase 默认值只能解决很小一部分的问题。通常数据都会有深层次的结构。

@kaneg 同上。
vinceguo
2017-12-20 22:48:23 +08:00
楼上有人提到 protobuf,那我就顺便说一下 thrift 吧。类似的东西
RorschachZZZ
2017-12-21 00:06:53 +08:00
这就是参数规范化的重要性。
Obelly
2017-12-21 01:44:26 +08:00
一种“天才”的解决方案,将所有非数字全部格式化成字符串,要处理数据再另行处理字符串文本内容……
Mutoo
2017-12-21 06:22:07 +08:00
1) json schema
2) lodash _.get(obj, path, default) 方法
https://lodash.com/docs/4.17.4#get

var object = { 'a': [{ 'b': { 'c': 3 } }] };

_.get(object, 'a[0].b.c');
// => 3

_.get(object, ['a', '0', 'b', 'c']);
// => 3

_.get(object, 'a.b.c', 'default');
// => 'default'
crysislinux
2017-12-21 07:12:13 +08:00
@cenqingbo 不全是,当然 schema 也不能保证逻辑正确,但是能保证该在的 fields 都在,类型都对
wxsm
2017-12-21 08:45:28 +08:00
@Mutoo 这种实际上就是逐个字段判断了。而且这个 defalt 有局限性,处理的只是 key 不存在的情况。万一存在而且是 null,那还是会有问题。还得再加判断。麻烦得很。
wotemelon
2017-12-21 09:02:41 +08:00
bfbd
2017-12-21 09:08:34 +08:00
Object.assign(retData, defaultData)
bfbd
2017-12-21 09:09:55 +08:00
写反了,应该是:newData = Object.assign({...defaultData}, retData)
vghdjgh
2017-12-21 09:23:57 +08:00
这种情况的解决方案就是接口文档中也提供一份语言无关的 protobuf 或 json schema 文件,然后收到数据时做验证
如果用 typescript,我用 https://github.com/plantain-00/types-as-schema 通过 types 生成 json schema 或 protobuf 文件
mougua
2017-12-21 09:34:11 +08:00
这种情况,我一般是买把菜刀放桌子上,然后叫后端同学来谈谈接口~~~~
YMB
2017-12-21 09:35:17 +08:00
我觉得开发 API,第一件事就是定义接口规范,第二是授权机制。
接口规范可以用一个类封装一下,授权机制可以用中间件过滤一下。
然后写业务逻辑,基本没什么问题。
th00000
2017-12-21 09:39:51 +08:00
我完全同意一楼的看法 出现这种情况直接把后端打残比较好
evolify
2017-12-21 09:39:57 +08:00
和楼主一样的情况。而且更离谱的是,对于为空 l 的字段,他们直接 ignore 了,说是什么发的数据少一点快一点,简直是扯淡的优化。之前好好的,这么一搞,我前端一堆 undefined. 现在我的做法是在接收后台数据时,手动重新赋值,所有字段都用我习惯的命名方式,不然他后台又一改字段或者说两个地方字段名不一致,那就 GG 了。
justfindu
2017-12-21 09:41:32 +08:00
这个完全不能做呀, 智能化了解你的接口数据, 比如你的示例 给的 b:null, 那我应该给 b 一个{} 还是一个[] 还是'' . 你会说你可以通过配置来确定某个接口给的数据是什么, 那为什么不直接跟后端沟通? 这才是正确的出路啊...不规范的接口以后都是痛. 难道你 APP 也要一个筛选?
wxsm
2017-12-21 09:42:52 +08:00
@wotemelon 这个有这么点意思,好像是我想要的东西。谢谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/416369

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX