热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

99%的顺序都没有斟酌的收集非常

本文由云+社区宣布绝大多数顺序只斟酌了接口一般事情的场景,而用户在运用我们的产物时碰到的种种异常,全都丢在看似ok的trycatch中。假如没有做好异常的兼容和兜底处置惩罚,会极大

本文由云+社区宣布

绝大多数顺序只斟酌了接口一般事情的场景,而用户在运用我们的产物时碰到的种种异常,全都丢在看似 ok 的 try catch 中。假如没有做好异常的兼容和兜底处置惩罚,会极大的影响用户体验,严峻的还会带来平安和资损风险。

接口异常,一般能够分为以下三类:

  • CGI 逻辑失足。如挪用方入参缺失类营业逻辑报错;
  • 效劳不稳定。如效劳器不稳定致使 nginx 种种 500、502,cgi 途径调解致使的 404
  • 用户收集环境差。如,收集不稳定、网速慢、运营商挟制等

那末,我们在写代码时,怎样疾速的模仿这些接口异常,做好顺序的兼容处置惩罚呢?

本日向人人引见收集调试神器 whistle 的收集异常调试要领,假如你还没用过 whistle,请参考《8102 年的顺序员不需要 Hosts 和 Fiddler》。

假定我们有以下前端页面 index.html,安排在本身的当地途径:



接下来,翻开 whistle Rules 设置面板 http://127.0.0.1:8899/#rules ,设置模仿的 demo page 和 mock CGI:

*/mock file://({"code":0,"data":"success"}) # 设置 mock cgi 为模仿的 json 数据
example.com file:///Users/kaiye/Projects/Markdown/20181213/ # 设置恣意域名到当地 demo 目次,这里注重替换成本身的途径

翻开 http://example.com ,一般逻辑下页面展现出了绿色的 success ,如今我们最先到场一些收集异常。

1、营业逻辑异常处置惩罚

比方 CGI 没有返回 data 字段,而是返回了一个毛病码 code 和对应的 message,针对这类营业逻辑异常我们只需在第二个 then 中做好 code 值的推断即可(注重,这里的 code、message、data 只是示例,现实营业 CGI 中的 JSON 构造体的字段名极能够差别):

fetch(`/mock?r=${Math.random()}`)
.then(respOnse=> response.json())
.then((v) => {
// 营业逻辑异常处置惩罚
if (v.code !== 0) {
return Promise.reject(new Error(`ERROR_LOGIC_CODE:${v.code}`));
}
document.getElementById('success').innerHTML = v.data;
})
.catch((err) => {
document.getElementById('fail').innerHTML = err.message;
});

响应的 whistle 设置以下:

*/mock file://({"code":12345,"message":"some_logic_error"}) # 模仿营业逻辑异常

2、效劳器异常处置惩罚

假如效劳器直接抛出了 502 毛病码,我们愿望代码能给用户提醒的同时,再做一个异常上报。

fetch(`/mock?r=${Math.random()}`)
.then((response) => {
// 效劳器异常处置惩罚
if (response.ok) {
return response.json();
}
return Promise.reject(new Error(`ERROR_STATUS_CODE:${response.status}`));
})
.then((v) => {
// 营业逻辑异常处置惩罚
if (v.code !== 0) {
return Promise.reject(new Error(`ERROR_LOGIC_CODE:${v.code}`));
}
document.getElementById('success').innerHTML = v.data;
})
.catch((err) => {
const [type, value] = err.message.split(':');
// 异常范例上报
console.log(type, value);
document.getElementById('fail').innerHTML = err.message;
});

经由过程 whistle 的模仿设置以下:

*/mock statusCode://502 # 模仿 HTTP 状况码异常

3、接口被挟制注入

假如 CGI 被运营商挟制注入,能够致使接口返回一个不合法的 JSON 构造,最前面的 response.json() 会抛异常,我们能够提早 catch 住:

fetch(`/mock?r=${Math.random()}`).then((response) => {
// 效劳器异常处置惩罚
if (response.ok) {
return (
response
.json()
// 接口数据解码异常处置惩罚
.catch(err => Promise.reject(new Error('ERROR_DECODE_JSON')))
);
}
return Promise.reject(new Error(`ERROR_STATUS_CODE:${response.status}`));
});

whistle 模仿设置以下:

*/mock file://(

hijacking
{"code":0,"data":"success"}) # 模仿接口被挟制注入 1

借助 htmlAppend 和 values 设置,能够模仿更庞杂的注入示例:

*/mock file://({"code":0,"data":"success"}) htmlAppend://{hijacking.html} # 模仿接口被挟制注入 2

4、用户收集不稳定

假如我们要模仿要求发出 10 秒后断网或收集不通的状况,能够经由过程 whistle 如许设置:

*/mock reqDelay://10000 enable://abort # 模仿 10 秒超时后收集不通

让用户苦苦守候 10 秒,再报错的体验太蹩脚。我们能够封装一个能设置超时时候的要求发送函数,同时把上面提到的毛病异常都一同设置进来。




如许,自定义的 myFetch 只需关注营业详细逻辑,针对差别的 catch error 做对应的处置惩罚。

除以上提到的协定命令字外,whistle 还支撑 resSpeed 用于模仿低网速传输(单元:kb/s),tpl 协定则能够依据要求传入参数来动态模仿差别的数据。在 Frames 面板,还能够对 WebSocket/Socket 要求举行停息、耽误等收集异常的模仿。

小顺序 fetch API 完成

末了,留一道思考题。

最近微信小顺序开辟异常火,小顺序原生供应的 wx.request API 能用于发送 HTTPS 要求,请在它的基本之上举行封装,支撑 promise 挪用和 timeout 超时时候定义(小顺序默许的要求超时定义在 app.json 中,不够天真),并针对以上提到的 HTTP 状况码异常、接口挟制注入、慢收集、无收集状况等种种收集异常举行兼容处置惩罚。

迎接留言分享你的代码完成

此文已由作者受权腾讯云+社区宣布


推荐阅读
  • 如何优化Webpack打包后的代码分割
    本文介绍了如何通过优化Webpack的代码分割来减小打包后的文件大小。主要包括拆分业务逻辑代码和引入第三方包的代码、配置Webpack插件、异步代码的处理、代码分割重命名、配置vendors和cacheGroups等方面的内容。通过合理配置和优化,可以有效减小打包后的文件大小,提高应用的加载速度。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • tcpdump 4.5.1 crash 深入分析
    tcpdump 4.5.1 crash 深入分析 ... [详细]
  • STM32 IO口模拟串口通讯
    转自:http:ziye334.blog.163.comblogstatic224306191201452833850647前阵子,调项目时需要用到低波 ... [详细]
  • 现在比较流行使用静态网站生成器来搭建网站,博客产品着陆页微信转发页面等。但每次都需要对服务器进行配置,也是一个重复但繁琐的工作。使用DockerWeb,只需5分钟就能搭建一个基于D ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • Python操作MySQL(pymysql模块)详解及示例代码
    本文介绍了使用Python操作MySQL数据库的方法,详细讲解了pymysql模块的安装和连接MySQL数据库的步骤,并提供了示例代码。内容涵盖了创建表、插入数据、查询数据等操作,帮助读者快速掌握Python操作MySQL的技巧。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • Python的参数解析argparse模块的学习
    本文介绍了Python中参数解析的重要模块argparse的学习内容。包括位置参数和可选参数的定义和使用方式,以及add_argument()函数的详细参数关键字解释。同时还介绍了命令行参数的操作和可接受数量的设置,其中包括整数类型的参数。通过学习本文内容,可以更好地理解和使用argparse模块进行参数解析。 ... [详细]
  • 本文是一篇翻译文章,介绍了async/await的用法和特点。async关键字被放置在函数前面,意味着该函数总是返回一个promise。文章还提到了可以显式返回一个promise的方法。该特性使得async/await更易于理解和使用。本文还提到了一些可能的错误,并希望读者能够指正。 ... [详细]
  • x86 linux的进程调度,x86体系结构下Linux2.6.26的进程调度和切换
    进程调度相关数据结构task_structtask_struct是进程在内核中对应的数据结构,它标识了进程的状态等各项信息。其中有一项thread_struct结构的 ... [详细]
  • 获取时间的函数js代码,js获取时区代码
    本文目录一览:1、js获取服务器时间(动态)2 ... [详细]
  • Imdevelopinganappwhichneedstogetmusicfilebystreamingforplayinglive.我正在开发一个应用程序,需要通过流 ... [详细]
author-avatar
霞慧水灵灵_973
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有