博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vscode中使用node服务调试,会在promise的reject出现断点报错
阅读量:6948 次
发布时间:2019-06-27

本文共 1970 字,大约阅读时间需要 6 分钟。

vscode

版本 1.19.2

提交 490ef761b76b3f3b3832eff7a588aac891e5fe80

日期 2018-01-10T16:16:25.767Z
Shell 1.7.9
渲染器 58.0.3029.110
Node 7.9.0
架构 ia32

 

昨天在使用vscode写node后台服务的时候出现了一个莫名其妙的bug:代码执行到promise内部,然后执行reject的时候vscode产生断点报错。通过命令行启动程序不会报错,但是通过vscode F5启动调试就会出现这个错误。

因为后台框架使用的是koa,所以大量的使用了Promise、async和await,然后就出现了这个问题,代码如下

checkLogin: async (ctx, next) => {    ctx.status = 200    try {      let decoded = await checkToken(ctx.request.body.token)      ctx.body = JSON.stringify({state: 'OK'})    }    catch(err) {      console.log(err)      ctx.body = JSON.stringify({error: err})    }  }  /**   * 检查token是否可用   */  checkToken: (token) => {    return new Promise((resolve, reject) => {      if (token) {        jwt.verify(token, 'zyx', (err, decoded) => { //解码token          if (err) {            return reject(err)          }          resolve(decoded)        })      } else {        reject('NO_TOKEN')      }    })  }

然后代码运行时报错如下(jsonwebtokenerror是err的类型,可以无视,因为不管reject传入的是什么,都会报相应数据类型的异常错误)

而且经过测试,不管在promise的何处调用reject都是会报相同的错误

最后在google上找到了具体的答案,

原文的解释是:

If a promise is rejected before an error handler is attached, the debugger will break, even if only "uncaught exceptions" is checked. If it's rejected after the error handler is attached, it works as expected. And really the problem is the way the promise doesn't know whether its rejection will be handled or not.

大致的意思就是说:

如果在promise处理异常之前就执行了jeject,vscode就会认为这个promise没有处理异常的过程,然后就报错了。

换句话说只要没有在promise的后面紧跟.catch或.then处理异常就会触发这个错误机制。而且不能在同步过程中触发reject,因为这个时候异常处理还没有挂载到promise上

function f1() {
  new Promise((resolve, reject) => {
    reject() //报错
  }).catch(e=>{console.log(e)})
}
 
function f1() {
  new Promise((resolve, reject) => {
    setTimeout(()=>{reject()},0) //异步执行后不报错
  }).catch(e=>{console.log(e)})
}
 
f1()

最后关于这个问题的解决方法:

这个问题应该算是vscode的一个关于js promise 的 bug,而我的代码是没有问题的,没有必要为了避免这个异常断点而hack来写代码。所以直接修改vscode的断点机制就可以了。

 

打开vscode的调试工具栏

然后在左下角取消选中 ‘未捕获的异常’ 选项

这样就解决了问题。

转载于:https://www.cnblogs.com/zhaozhipeng/p/8350197.html

你可能感兴趣的文章
php设计模式-单例模式
查看>>
php扩展php-redis安装与使用
查看>>
python一天一题(2)
查看>>
[HTML5] Semantics for accessibility
查看>>
Win10下安装Ubuntu16.04虚拟机并搭建TensorFlow1.3环境
查看>>
leetcode 108. Convert Sorted Array to Binary Search Tree
查看>>
【商城购物车】购物车逻辑
查看>>
PCIE协议解析 synopsys IP loopback 读书笔记(1)
查看>>
关于小程序你需要知道的事
查看>>
表服务器无法打开与报表服务器数据库的连接。所有请求和处理都要求与数据库建立连接...
查看>>
4月第4周业务风控关注 | 网络犯罪经济每年1.5万亿美元 GDP居全球第12位
查看>>
idea中gitlab新创建分支查找不到的原因
查看>>
php调试时echo,print_r(),var_dump()的区别
查看>>
vue 作用域插槽
查看>>
tfs 2013 利用 web deploy 完成asp.net站点自动发布
查看>>
dom对象常用的属性和方法有哪些?
查看>>
C#遍历XmlDocument对象所有节点名称、类型、属性(Attribute)
查看>>
范畴论-一个单子(Monad)说白了不过就是自函子范畴上的一个幺半群而已
查看>>
Spring cloud系列之Zuul配置项中sensitiveHeaders和ignoredHeaders
查看>>
51单片机交通灯(定时器+38译码器+中断)
查看>>