解决数据兼容性问题

news2024/12/25 15:10:53

数据兼容性问题解决

问题说明

最近经常遇到新老数据兼容性的问题:某些新同事更改代码后,没有兼容旧数据,已有用户的数据显示不全或者错误,很麻烦。

技术层面,就是某个数据或者字段,存储在服务器上,版本迭代后,数据类型变化,前端需要兼容已有的数据类型。

例如一个用户对象:

例如第一版中,包括了姓名(字符串),年龄(数字),性别(布尔值)

let user1 = {
  version: 1,
  name: 'Michael',
  age: 20,
  isFemale: true,
};

第二版中

产品改了需求,针对国外用户,姓名改成了姓,名两个字段

性别改成了字符串,有的用户选择不显示性别

let user2 = {
  version: 2,
  first_name: 'Michael',
  last_name: 'An',
  age: 20,
  gender: 'male' or 'female' or ''
}

第三版中,增加了地址(字符串)

let user3 = {
  version: 3,
  first_name: 'Michael',
  last_name: 'An',
  age: 20,
  address: 'Beijing',
  gender: 'male',
}

第四版中,可能有多个住址,地址字段改成数组

let use4 = {
  version: 4,
  first_name: 'Michael',
  last_name: 'An',
  age: 20,
  address: ['Beijing', 'Shanghai'],
  gender: 'male' or 'female',
}

后端返回的数据中,有这些情况,那么前端使用时,需要兼容这多个版本的数据。

解决思路

可以添加 version 字段,数据预处理代码如下:

const preprocess = function(user) {
  if (typeof user !== 'object') {
    console.log('用户无效');
    return null;
  }
  if (user.version === 1) {
    const { age } = user;
    return {
      version: 4,
      first_name: user.name,
      last_name: '',
      age,
      address: [],
      gender: user.isFemale ? 'female' : 'male',
    };
  }
  else if (user.version === 2) {
    const { first_name, last_name, age, gender } = user;
    return {
      version: 4,
      first_name,
      last_name,
      age,
      address: [],
      gender,
    }
  }
  else if (user.version === 3) {
    const { first_name, last_name, age, gender, address } = user;
    return {
      version: 4,
      first_name,
      last_name,
      age,
      address: [address],
      gender,
    }
  }
  else if (user.version === 4) {
    return user;
  }
}

如果未来新增其他属性,那么根据新属性继续兼容。

也可以写一个 model user 类处理属性,优化代码,代码如下。

class User {
  constructor(obj) {
    this.version = obj.version || 4;
    this.first_name = obj.first_name || '';
    this.last_name = obj.last_name || '';
    this.age = obj.age || 0;
    this.address = obj.address || [];
    this.gender = obj.gender || '';
  }
}

最佳实践

最好的解决办法,还是在初期设计考虑各种情况,考虑后续的兼容性。

实际上,前端数据兼容比较容易,后端数据兼容处理的就比较复杂,还需要处理脏数据和大量数据的情况等,根据实际情况分析。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/193494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java后端工程师面试题(笔试):2022-11-04 经历(一)

java后端工程师面试题(笔试):2022-11-04: 面试题:总分100 1、关于盒子模型(5分) 1)盒子模型的种类有几种?分别是什么?(1分) 2种,分别是1、W3C标准盒子模型 2、IE盒子模型2) 容器中使用di…

射频已调波同步广播技术在山区高速公路同步广播建设中的应用

北京恒星科通发布于2023-2-2 我国高速公路建设速度的加快,目前我国已经建成通车的高速公路总里程已经达到14万公里,高速公路的安全与信息化建也达到了快速发展,高速公路调频广播覆盖一直是困扰高速公路管理方的一个重要问题,我国…

实时分析全面赋能金融业务,马上消费基于 Apache Doris 构建实时数仓的实践

导读: 近年来,马上消费的业务体量呈飞跃式增长,每天产生数据可达上千亿条,如何更高效挖掘这些数据的价值,成为了其必须要面临的挑战。随着各业务对实时数据分析的需求越来越强烈,马上消费于 2021 年引入 Ap…

点云处理指南介绍

目录 一、点云处理介绍: 二、Open3D文章目录: Open3D几何部分(Geometry) 点云处理(点云IO/可视化/数据结构/下采样/凸包计算/裁减/法向量估计/聚类/隐藏点移除/平面分割/最小外接矩形/外点移除) 面片&…

HTML5+CSS3(三)-全面详解(学习总结---从入门到深化)

目录 Form表单 表单元素 学习效果反馈 表单元素一 文本框 密码框 单选按钮 学习效果反馈 表单元素二 复选框 文件 提交按钮 重置按钮 学习效果反馈 表单元素三 下拉列表 多行文本框 label 学习效果反馈 HTML5新增type类型一 url search tel color 学习效果反馈 HTML5新增…

「Python|网页开发」如何使用Django快速开始进行网页开发:写个Hello World!

本文主要介绍如何从零开始借助django框架快速启动一个网页服务器然后进入编写HTML页面的阶段。 文章目录安装django创建并启动网页项目在网页项目中创建一个应用创建页面并设置好对应关系安装django Django是Python的一个第三方库,里面已经将编写网页需要的代码结构…

如何更改报表控件 Stimulsoft BI 服务器中的地址和端口?

在本文中,我们将主要讨论如何在 Stimulsoft BI Server 中设置基本参数,具体来说,也就是如何更改服务器的地址和端口? 为什么需要更改服务器地址和端口? 在部署报表服务器时,需要指定其地址,实…

使用Websockets和Vert.x进行实时竞价

翻译: 白石(https://github.com/wjw465150/Vert.x-Core-Manual) 原文地址: https://vertx.io/blog/real-time-bidding-with-websockets-and-vert-x/ 在过去的几年中,用户对网络应用程序的期望发生了变化。在拍卖竞价过程中,用户不再需要按下刷新按钮来检…

【C++】STL — map和set的介绍 + 使用

文章目录📖 前言1. 键值对的引入⚡2. 树形结构的关联式容器🌟3. set的介绍 使用⭐4. map的介绍 使用⭐🏁4.4.1 利用map统计次数:🏁4.4.2 std::map::operator[]📖 前言 本章将继续学习STL中的两个很重要的…

23.2.2打卡 2023牛客寒假算法基础集训营5 ABCDHKL 最详细的一集

A 这题据说可以贪心写 我为了省事直接upper二分第一个大于x的商品然后向前遍历完事 /* ⣿⣿⣿⣿⣿⣿⡷⣯⢿⣿⣷⣻⢯⣿⡽⣻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠸⣿⣿⣆⠹⣿⣿⢾⣟⣯⣿⣿⣿⣿⣿⣿⣽⣻⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣻⣽⡿⣿⣎⠙⣿⣞⣷⡌⢻⣟⣿⣿⣿⣿⣿⣿⣿…

使用动态创建pinia时报injection “Symbol(pinia)“ not found

前阵发现项目内用pinia报了injection "Symbol(pinia)" not found这个错误,因为前一阵用并没有这个问题。问了相关同事后发现是他新建了节点后调用的,导致的问题。 出现的警告如下图: 这问题排除了比较久,为什么呢&…

python自动化办公--pyautogui控制鼠标和键盘操作

在公司某些工作场景下,需要大量重复的工作,重复的工作完全可以通过python软件的自动化实现,省时省力。本文分享python自动化办公的利器之一--pyautogui,通过pyautogui可以轻松控制鼠标和键盘操作。 PyAutoGUI是一个纯Python的GUI自…

纯滞后系统的大林控制算法

大林控制算法原理早在1968年,美国IBM公司的大林(Dahlin)就提出了一种不同于常规PID控制规律的新型算法,即大林算法。该算法的最大特点是将期望的闭环响应设计成一阶惯性加纯延迟,然后反过来得到能满足这种闭环响应的控…

Linux服务器之间设置共享目录

前言有时候我们需要在两台linux服务器之间共享资源,例如在服务器A上面部署了一个大文件上传程序,但是需要将文件上传到服务器B的某个目录下面,因为上传大文件,需要先将文件所有分块单独上传到服务器B,然后在服务器B上面…

数字文档管理解决财务部门哪些常见问题?

如今,会计部门实施文档管理和自动化工作流程系统至关重要。这些组织要么缺乏数字系统,要么没有充分利用其文档管理解决方案的潜力。 数字文档管理解决财务部门哪些常见问题? 1.错过提前付款折扣:供应商经常为提前付款提供折扣&am…

虹科教您 | 浅谈现代GNSS模拟中的软件定义架构

随着技术的迭代更新,GPS/GNSS模拟技术也在不断发展进步。在过去,想要进行GNSS仿真基本上只有一种选择:使用固定式或分配式的硬件进行模拟。而如今,带来颠覆性创新的新型软件定义架构正在迅速取代传统的定制架构,这种独…

EvilnoVNC:一款针对组织安全与安全意识培训的网络钓鱼平台

关于EvilnoVNC EvilnoVNC是一款针对组织安全与安全意识培训的网络钓鱼平台,该工具开箱即用,可以帮助各大企业组织对内部员工进行安全意识培训,而且也可以帮助广大研究人员测试和研究网络钓鱼防御技术。 和其他网络钓鱼技术不同的不同之处在…

高并发秒杀的 常见的7种方案

高并发场景在现场的日常工作中很常见,特别是在互联网公司中,这篇文章就来通过秒杀商品来模拟高并发的场景。 本文环境: SpringBoot 2.5.7 MySQL 8.0 X MybatisPlus Swagger2.9.2 模拟工具: Jmeter 模拟场景: 减库…

2.5G网卡调试记录

2.5G网卡调试记录 下载驱动 去https://www.realtek.com/zh-tw/downloads这个网站下载2.5G USB网卡对应的驱动 编译驱动 Makefile中需要进入到内核目录/lib/modules/4.19.232/build中进行内核编译,但是我们的build文件链接已经失效了,并且源文件也删除…

力扣sql简单篇练习(八)

力扣sql简单篇练习(八) 1 修复表中的名字 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 考察的是字符串函数的用法 SELECT user_id,concat(upper(left(name,1)),lower(substr(name,2))) name FROM Users ORDER BY user_id asc1.3 运行截图 2 订单…