Skip to content

不少同学都是用 console.log 调试的,哪怕工作很多年依然是这样,这样有个致命的缺点:

你只能看到某个点的变量值,而看不到代码的整个执行路线。

对于复杂的项目来说,会用断点调试是必须的,因为这样可以看到作用域、调用栈,也就是代码的执行路线,然后单步运行来看变量的变化。

所以这一节我们来学下如何调试 nest 项目。

首先,先看下 node 调试:

创建个项目:

mkdir debug-test
cd debug-test
npm init -y

添加 index.js

javascript
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 功能多一点)

json
{
    "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 项目的调试,就可以直接在代码里打断点了。