多年经验的程序员,却差点出生产事故,到底发生了啥?

前言

现如今的状态,我更看重开发过程的严谨性,随着我们在学习中,工作中,学习到的知识点越来越多,导致我们在开发过程中很多都记不清楚,或是有些知识点你其实是知道的,可是在实际开发时,你就是把相关的知识点给忘了,从而导致开发时思维逻辑不够严谨,初看或者测试都没有测试出问题,但实际上因为你漏掉了一层逻辑,最终导致线上出了生产事故。

需求背景

在项目中接入其他团队的一个抖音的聊天页面,约定方式为 iframe 接入,需要传递的参数为:

参数名称 类型 说明
dataId String 唯一Id(sm4加密)
role String 角色 0 = 组员,1 = 组长
signature String 签名,生成方式,以 keyValueKeyValue 形式拼接参数,最后拼接密钥,再以md5进行加密传输

我们来解读一下这个参数:

  • dataId: sm4 加密的唯一Id
  • role: 角色,这个简单
  • signature: 按照说明可以确定他的数据要求为:
js 复制代码
var dyHost = 'dy.xxxx.com.cn';
var key = "u3U0p9niWo0n1bL6"; // 密钥
var dataId = "3bcd76954353f3e05304251ddf5a3ee7"; // 加密后的唯一Id
var role = "1"; // 角色
var signature = `dataId${dataId}role${role}${key}`; //理想中的签名

所以我当时面临的工作就是要在 iframe 中添加地址与参数,地址啥都比较简单,参数看似还是比较简单所以很自然的快速完成任务,把地址拼接好放进src属性,齐活。

js 复制代码
// 此处引用 md5 的工具 md5.min.js 这里就不实际引用了
var signature = md5(signature);
var url = `https://${dyHost}/yunChat.html?dataId=${dataId}&role=${role}&signature=${signature}`;
$("#dy_iframe")[0].contentWindow.location.href = url;

至此感觉已经万事具备了,可以提代码了。

差一点就出了生产事故

就到此刻我一点都没有意识到问题的存在,直到上了测试环境,对接的团队给我提了一个问题,说拿不到参数,我懵逼了,反复看了他们提供的对接文档,是这么拼接的参数啊,没啥毛病啊,到此刻我都还没有意识到问题出在哪里?我只能在测试环境进行调试,调试中才发现,我拿到的 dataId 也就是后端用 sm4 加密后的 dataId 中出现了保留字符(;/?:@&=+$,),导致对接的团队拿不到参数,恍然大悟,这我才想起需要对 url 编码,但凡是测试没有用到 sm4 编码后没有特殊字符的 dataId,那么生产事故那肯定就出了啊。意识到了问题的存在,那接下来就是怎么解决这个问题。要解决保留字符的转译,这里选择用 encodeURIComponent 方法,用来编码或解码的4种URI我这里就不去详细解释,搞忘的或者感兴趣就自己去查一下。

js 复制代码
// 此处引用 md5 的工具 md5.min.js 这里就不实际引用了
var signature = md5(signature);
var url = `https://${dyHost}/yunChat.html?dataId=${encodeURIComponent(dataId)}&role=${role}&signature=${signature}`;
$("#dy_iframe")[0].contentWindow.location.href = url;

最终把问题解决了,我们先来复盘一下,为啥会出问题:

  1. 拿到需求与对接文档,对于拼接地址的知识准备不够充分,忽略了编码的问题;
  2. 对 sm4 加密的知识不了解,也没有去了解,只看到对接示例提供的dataId没有保留字符,就自认为没有保留字符;
  3. 对于编码这个知识点知道,但是开发的时候,不知道,归根到底一句话,知识点因为时间,或者发散导致的断层。

总结

这篇文章对知识的介绍比较少,主要是在介绍开发过程中的一些感悟。我们常常忽略,或者遗漏一些小细节,这些小细节不容易发现,但是它又决定着一些特殊情况的处理。我们都知道,知识是死的,用得好才是活的,用的不好,就是负担。对于具有有些经验的小伙伴,可能看到一个需求,凭着多年的开发经验就大概有了设计思路,但是俗话说水淹会水将,可能现在很多时候,大多出问题的地方都是"凭着多年的开发经验"。所以,当我们拿到需求后,还是要做比较严谨的设计,虽然我们经验还算丰富,那么就利用设计的时候,把相关的知识做一个温故,解决知识点的断层,这样两全其美的事我觉得是值得的,退一万步讲,即使要跳槽,在准备面试笔试时,都要少花好多时间。

相关推荐
上海魁鲸科技有限公司7 小时前
APS高级排产系统到底有什么用?一文讲清功能、选型与落地建议
前端·microsoft·excel
陈随易8 小时前
Bun v1.4 更新总结:把浏览器、图片、定时任务和工程工具都装进一个运行时
前端·后端·程序员
东风破_9 小时前
TypeScript 高级类型进阶:keyof、Exclude、Record 与类型组合思想
前端·后端·typescript
DS随心转插件9 小时前
Grok生成的html怎么导出——AI导出鸭:大模型结构化输出的“最后一公里”工程化解构
前端·人工智能·ai·html·豆包·deepseek·ai导出鸭
demo007x10 小时前
DSH harness 中的上下文管理探秘
程序员·agent·deepseek
এ慕ོ冬℘゜10 小时前
使用 jQuery 动态渲染表格与状态切换
前端·javascript·jquery
人间凡尔赛10 小时前
2026 前端必修:4 个让 CSS 脱胎换骨的现代新特性(附实战代码)
前端·css
用户21816970493010 小时前
Flutter (二十) 轮播图
前端
前端snow10 小时前
ai agent - RAG 汇总
前端
智购科技自动售货机厂家11 小时前
2026自动售货机AI视觉识别优化:从YOLOv11n模型量化到RKNN部署的端侧推理工程实践~YH
javascript·人工智能·yolo·机器学习·计算机视觉·目标跟踪·perl