不少同学都是用 console.log 调试的,哪怕工作很多年依然是这样,这样有个致命的缺点:
你只能看到某个点的变量值,而看不到代码的整个执行路线。
对于复杂的项目来说,会用断点调试是必须的,因为这样可以看到作用域、调用栈,也就是代码的执行路线,然后单步运行来看变量的变化。
所以这一节我们来学下如何调试 nest 项目。
首先,先看下 node 调试:
创建个项目:
mkdir debug-test
cd debug-test
npm init -y
添加 index.js
const os = require('os');
const homedir = os.homedir();
console.log(homedir);
通过 os 模块拿到了 home 目录的路径。
直接 node 执行会输出结果:
我们以调试模式跑起来:
node --inspect-brk index.js
--inspect 是调试模式运行,而 --inspect-brk 还会在首行断住。
可以看到,它起了一个 ws 服务。
然后我们用调试客户端连上它,比如用 Chrome DevTools。
打开 chrome://inspect/,可以看到可以调试的目标:
如果没有,就配置下 network target,加上 localhost:9229
点击 inspect 就可以看到调试界面了:
代码在首行断住了,右侧也可以看到作用域和调用栈。
可以单步调试:
nest 也是 node 项目,自然也是这样来调试的。
nest start 有个 --debug 的选项,
原理就是 node --inspect。
这时候 inspect 发现啥也没:
因为 --inspect 并不会和 --inspect-brk 一样在首行断住。
我们在 controller 里加个 debugger:
然后访问下 http://localhost:3000
这时候你会发现代码在断点处断住了:
可以看到代码的整个执行路线:
这样,就可以调试 nest 项目了。
但是这样调试还是太麻烦,我们一般在 VSCode 里写代码,能不能直接在 VSCode 里边写代码边调试呢?
当然是可以的。
VSCode 也实现了 Debugger 的客户端。
点击调试面板的 create launch.json file,它会创建 .vscode/launch.json 的调试配置文件:
然后输入 node,快速创建一个 node 调试配置:
我们先调试下前面那个 index.js 文件:
stopOnEntry 是在首行断住,和 --inspect-brk 一样的效果。
这样,就可以在 vscode 里调试 node 代码了。
在 vscode 里调试代码,最爽的是可以边改代码边调试。
比如你调试的过程中修改了代码,然后点击重新调试,就可以马上看到改动之后的效果:
调试体验就很棒!
nest 自然也可以这样调试:
还是 nest start --debug 来启动 nest 服务:
添加一个 attach 类型的调试配置:
然后在 controller 里打个断点,访问 http://localhost:3000
代码同样会在断点处断住。
这样就可以直接在 vscode 里打断点了。
不过如果是用 VSCode 调试,可以不用 nest start --debug,有更简便的方式:
创建 npm scripts 的调试配置:
(如果创建出的调试配置 type 是 pwa-node 也可以,和 node 类型差不多,据说 pwa-node 功能多一点)
{
"type": "node",
"request": "launch",
"name": "debug nest",
"runtimeExecutable": "npm",
"args": [
"run",
"start:dev",
],
"skipFiles": [
"<node_internals>/**"
],
"console": "integratedTerminal",
}
和我们命令行执行 npm run start:dev 一样。
这里的 runtimeExecutable 代表执行什么命令,args 传参数。
要指定 console 为 integratedTerminal,也就是用 vscode 的内置终端来打印日志,不然默认会用 debug console 跑,那个没有颜色:
点击调试模式启动:
然后浏览器访问 http://localhost:3000
代码同样会在断点处断住。
这是最方便的调试 nest 项目的方式。
最后,介绍几种断点的类型,也是挺常用的:
有的时候只想打印日志,不想断住,又不想加 console.log 污染代码,这时候可以用 logpoint:
右键选择 logpoint:
输入打印的信息,变量用 {} 包裹。
代码执行到这里就会打印:
这样适合不需要断住,但想打印日志的情况。不用在代码里加 console.log。
再就是条件断点:
表达式成立才会断住。
再就是异常断点,可以在没有处理的异常处自动断住:
这些断点类型只要有个印象,用到的时候能想起来就行。
总结
复杂的代码需要用断点调试查看调用栈和作用域,也就是代码的执行路线,然后单步执行。
node 代码可以加上 --inspect 或者 --inspect-brk 启动调试 ws 服务,然后用 Chrome DevTools 或者 vscode debugger 连上来调试。
nest 项目的调试也是 node 调试,可以使用 nest start --debug 启动 ws 服务,然后在 vscode 里 attach 上来调试,也可以添加个调试配置来运行 npm run start:dev。
nest 项目最方便的调试方式还是在 VSCode 里添加 npm run start:dev 的调试配置。
此外,我们还理解了 logpoint、条件断点、异常断点等断点类型。
学会了 nest 项目的调试,就可以直接在代码里打断点了。