首页 文章 精选 留言 我的

精选列表

搜索[bug],共10000篇文章
优秀的个人博客,低调大师

Vue 修复了 watch 的 BUG

前言 在之前的项目中,需要做全局错误的收集和上报,最后有个头疼的问题就是 Vue watch 中的异步错误无法上报到 errorHandler 里面,然后在某一天我再次阅读 Vue 代码的时候,发现他在 2.6.13 版本上修复了这个问题,开心!!! 例子 大家可以切换 Vue 的版本号,来看看效果,你会发现 <= 2.6.12 版本的 watch 都不会捕获到异步错误 <!-- vue 2.6.12 --> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script> <div id="app"> <button @click='num++'>{{ num }}</button> </div> <script> Vue.config.errorHandler = (err, vm, info) => { console.log('收集到错误:', err) } new Vue({ el: '#app', data: { num: 100 }, watch: { async num() { // 加 await 是为了捕获异步错误 await this.errorFnc() } }, methods: { errorFnc() { return new Promise((resolve, reject) => { reject('promise 错误') }) }, // 或者 async 函数 // async errorFnc() { // throw 'async 错误' // }, } }) </script> 复制代码 Vue 是如何解决的 2.6.12 Vue.prototype.$watch = function ( expOrFn: string | Function, cb: any, options?: Object ): Function { const vm: Component = this if (isPlainObject(cb)) { return createWatcher(vm, expOrFn, cb, options) } options = options || {} options.user = true // Watcher 里面执行回调函数和下面一样,就不贴代码了 const watcher = new Watcher(vm, expOrFn, cb, options) if (options.immediate) { try { // 直接执行回调函数 cb.call(vm, watcher.value) } catch (error) { handleError(error, vm, `callback for immediate watcher "${watcher.expression}"`) } } return function unwatchFn () { watcher.teardown() } } 复制代码 2.6.13 Vue.prototype.$watch = function ( expOrFn: string | Function, cb: any, options?: Object ): Function { const vm: Component = this if (isPlainObject(cb)) { return createWatcher(vm, expOrFn, cb, options) } options = options || {} options.user = true // Watcher 里面执行回调函数和下面一样,就不贴代码了 const watcher = new Watcher(vm, expOrFn, cb, options) if (options.immediate) { const info = `callback for immediate watcher "${watcher.expression}"` pushTarget() // 用该函数去执行回调函数 invokeWithErrorHandling(cb, vm, [watcher.value], vm, info) popTarget() } return function unwatchFn () { watcher.teardown() } } 复制代码 对比版本 我们发现两个版本不同的是执行回调函数的方式变了,通过 invokeWithErrorHandling 执行回调函数,如果是 promise 的话会被 catch,从而被 handleError 报告上去。 export function invokeWithErrorHandling ( handler: Function, context: any, args: null | any[], vm: any, info: string ) { let res try { res = args ? handler.apply(context, args) : handler.call(context) if (res && !res._isVue && isPromise(res) && !res._handled) { res.catch(e => handleError(e, vm, info + ` (Promise/async)`)) // issue #9511 // avoid catch triggering multiple times when nested calls res._handled = true } } catch (e) { handleError(e, vm, info) } return res } 复制代码 思考 有人可能会问,为什么不 try catch 自己上报错误信息,或者这个有什么用? 自己 try catch,重复工作量极大。 对 Vue 来说这个是一个很小的修复,但对于一个线上项目来说,如果无法上报你的所有错误,那么有些地方就可能会影响到用户体验,产生用户的流失,甚至让公司财产损失。 Vue 如何进行错误收集和上报 对于我们开发者来说,最好是不用手动上报错误,这会带来很多重复性的工作,我们最好只用关注我们的正常的业务逻辑,而对于 Vue 工程来说,Vue 会自动上报我们的错误,我们只要保证一定的写法,错误就不会丢失。 第一步 我们全局只需要一个上报错误的地方,那就是 Vue 的 errorHandler,Vue 会把所有错误上报到这个函数,你可以直接应用 sentry,或者在这个函数里面调用后台的错误上报接口。 第二步 我们确定了上报错误的地方,下面要做的就是保证所有错误能被 Vue 捕获到,同步任务的错误会被直接捕获,而异步任务的错误,我们必须使用一定的写法。 异步错误 项目中我们最多的是和后台交互,如下 写法一 这个是我在项目中见的最多的写法,一旦使用了 then 来处理异步任务,就意味着我们的错误不会被 Vue 捕获,如果我们 then 回调函数里面出现了错误,我们还得在最后面写一个 .catch 来捕获 then 回调函数里面的错误,这种写法给我们开发者加大了很多的工作量。 mounted() { // 不会捕获到错误 this.getData() }, methods: { getData() { http.get('xxx').then(data => { // xxx }, error => { // 只能自己上报异步错误 }) } } 复制代码 写法二 我们只用换成 async await 来替代我们 then 的写法,所有错误就会被捕获到,而且更加简洁 async mounted() { // 使用 await 可以捕获到异步错误 await this.getData() }, methods: { async getData() { const data = await http.get('xxx') // xxx } } 复制代码 如何保证所有人使用 async 语法开发 如果你的项目中大家都可以遵守这种写法,那就不用往下看了。 对于开发项目来说,开发者是不可控的,编码风格也是千变万化,而且就算记住了哪种写法,在实际开发的时候也会有疏忽,还是能用工具解决的就不用口头去约束。 借助 eslint 基于 eslint 我们可以很轻松制定一套规则,但有一些规则是没有的,就需要我们自己开发,我对上面 async 语法的约束写了一个插件:eslint-plugin-leon-rule,大家可以参考下源码或者使用。 最后 如果你觉得此文对你有一丁点帮助,点个赞。或者可以加入我的开发交流群:1025263163相互学习,我们会有专业的技术答疑解惑 如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点star:https://gitee.com/ZhongBangKeJi/CRMEB不胜感激!

优秀的个人博客,低调大师

Debian 10.9 发布,聚焦 Bug 修复

Debian 正式发布其稳定发行版 Debian 10(代号为buster)的第九次更新。这个版本主要增加了对安全问题的修正,以及一些严重问题的调整。 本次更新内容如下: avahi:删除不再需要的 avahi-daemon-check-dns 机制; base-files :更新 /etc/debian_version 以适应10.9点版本的需要; cloud-init:避免将生成的密码记录到全局可读的日志文件 [CVE-2021-3429]; debian-archive-keyring:添加 bullseye keys; 删除 jessie keys; debian-installer:使用 4.19.0-16 Linux 内核 ABI; debian-installer-netboot-images:根据建议的更新进行重建; exim4:修复 GnuTLS 下并发 TLS 连接的使用;修复 CNAMEs 的 TLS 证书验证;README.Debian:记录默认配置中服务器证书验证的限制/范围; fetchmail:在 SSL_connect() 过程中不再报告系统错误;移除 OpenSSL 版本检查; fwupd:增加 SBAT 支持; fwupd-amd64-signed:增加 SBAT 支持; fwupd-arm64-signed:增加 SBAT 支持; fwupd-armhf-signed:增加 SBAT 支持; fwupd-i386-signed:增加 SBAT 支持; fwupdate:增加 SBAT 支持; fwupdate-amd64-signed:增加 SBAT 支持; fwupdate-arm64-signed:增加 SBAT 支持; fwupdate-armhf-signed:增加 SBAT 支持; fwupdate-i386-signed:增加 SBAT 支持; gdnsd:修复 IPv6 地址过大的堆栈溢出[CVE-2019-13952]; hwloc-contrib:启用对 ppc64el 架构的支持; intel-microcode:更新各种微码; iputils:修正 ping 四舍五入错误;修正 tracepath 目标损坏; jquery:修复不受信任的代码执行漏洞[CVE-2020-11022 CVE-2020-11023]; libbsd:修复越界读取问题 [CVE-2019-20367]; libpano13:修复格式字符串漏洞; libreoffice:不会从当前的目录加载 encodings.py; 更多详情可查看:https://www.debian.org/News/2021/20210327

优秀的个人博客,低调大师

zorm 1.3.5 发布,新年无 BUG

zorm是golang轻量级ORM,支持达梦(dm),人大金仓(kingbase)数据库. 源码地址:https://gitee.com/chunanyong/zorm go get gitee.com/chunanyong/zorm 基于原生sql语句编写,是springrain的精简和优化. 自带代码生成器 代码精简,总计2000行左右,注释详细,方便定制修改. 支持事务传播,这是zorm诞生的主要原因 支持mysql,postgresql,oracle,mssql,sqlite,dm(达梦),kingbase(人大金仓) 支持数据库读写分离 更新性能zorm,gorm,xorm相当. 读取性能zorm比gorm,xorm快一倍 测试用例即文档:https://gitee.com/chunanyong/readygo/blob/master/test/testzorm/BaseDao_test.go 生产使用参考UserStructService.go 更新内容如下: 完善注释文档 修复Delete方法的参数类型错误 其他代码细节优化.

优秀的个人博客,低调大师

ExcelUtil 3.0.5 发布,修复若干bug

更新内容如下: 1.修复导出int,float,double,Date 类型的字段,在读取时候发生异常的问题 2.新增表头,合并第一行为表头(和导出文件名称保持一致) 用法如下: //浏览器中直接下载 //导出不带表头,文件名称用当前时间,年月日时分秒命名 @GetMapping(value = "/export") public void testExport(HttpServletResponse response) throws Exception{ List<PhoneModel> list = new ArrayList<>(); PhoneModel model = null; for(int i=0;i<10;i++){ model = new PhoneModel(); model.setNum((i+1)); model.setColor("金色"+i); model.setPhoneName("苹果"+i+"S"); model.setPrice(i); model.setSj(new Date()); list.add(model); } ExcelUtil.exportExcelOutputStream(response,list,PhoneModel.class); } //导出带表头,文件名称和表头保持一致 @GetMapping(value = "/exportHeader") public void testExportHeader(HttpServletResponse response) throws Exception{ List<PhoneModel> list = new ArrayList<>(); PhoneModel model = null; for(int i=0;i<10;i++){ model = new PhoneModel(); model.setNum((i+1)); model.setColor("金色"+i); model.setPhoneName("苹果"+i+"S"); model.setPrice(i); model.setSj(new Date()); list.add(model); } ExcelUtil.exportExcelOutputStream(response,list,PhoneModel.class,"这是表头也是文件名"); } 引入pom <!--https://mvnrepository.com/artifact/net.oschina.likaixuan/excelutil--> <dependency> <groupId>net.oschina.likaixuan</groupId> <artifactId>excelutil</artifactId> <version>3.0.5</version> </dependency> 相关链接

优秀的个人博客,低调大师

Django 3.0.2 发布,Bug 修复版本

Django 3.0.2 发布了,主要更新内容如下: Bugfixes 修复了 Django 3.0 中的回归问题,该回归在 GROUP BY 子句中不包含 Subquery() 引用的列 (#31094). 修复了 Django 3.0 中的回归问题,如果查询集包含SubQuery() 上的聚合,则 QuerySet.exists() 会崩溃(#31109). 修复了 Django 3.0 中的回归问题,该回归在添加外键并在同一迁移中更改数据时导致 PostgreSQL 10+ 上的迁移崩溃 (#31106). 修复了 Django 3.0 中的回归问题,该回归问题导致定义主键默认值的模型的加载装置崩溃 (#31071). 更新说明:https://docs.djangoproject.com/en/3.0/releases/3.0.2/

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册