配置 debug 环境

在 Chrome 中 debug

node.js 有一种node inspect调试模式,即使用命令:

js
1node --inspect-brk <entry>

-brk会让代码在首行断住。

例如入口文件为 index.js,则使用node --inspect-brk index.js,我们往往会在 scripts里配置脚本:

json
1  "scripts": {
2    "start:debug": "node --inspect-brk index.js",
3  },

这样就可以使用脚本命令进入 debug 状态了。

nest 是 node 框架,自然也可以这么使用,并且 nest 已经内置了start:debug脚本,我们直接执行以下命令:

bash
1pnpm run start:debug

该命令会在本地开启一个 ws 服务:

bash
1Debugger listening on ws://127.0.0.1:9229/58402875-128d-47be-adc1-2e9cbf04c528
2For help, see: https://nodejs.org/en/docs/inspector
3Debugger attached.

可以看到 ws 服务的端口号为 9229。

我们可以直接使用Chrome DevTools 调试客户端连上它。

接着修改代码,在需要断点的地方输入debugger,因为默认并没有-brk 参数,所以手动在需要断点的地方 break。

typescript
1  @Get()
2  getHello(): string {
3    debugger;
4    return this.appService.getHello();
5  }

再进入http://localhost:3000/,打开 Chrome DevTools,会看到有一个按钮,点击它就能够进入 debug 界面。

image-20230930113339118

下面界面就是浏览器的 node 调试面板。

image-20230930113518632

如果没有出现该按钮,说明浏览器的 Dev Tools 还没有连到 ws 上,需要配置一下 network targets :

  • 输入chrome://inspect 查看配置。

    如果没有 Remote Target 就需要点击 configure 按钮。

    image-20230930113856773

  • 输入localhost:9229

    image-20230930114119330

这种调试方法的好处是比较容易,chrome 的 debug 调试界面体验比较好,适合习惯 chrome 浏览器的前端同学。

在 VSCode 中 debug

有些同学可能更喜欢于利用 IDE 来断点调试,这里再介绍直接用 VSCode 调试的方法。

仅用 vscode 调试可以不用执行pnpm run dev:debug

在 vscode 的 Run and Debug 下创建launch.json文件。

image-20230930115326784

launch.json 是 vscode 调试的配置文件。

输入 npm,点击Node.js:Launch via npm

image-20230930115745697

按照以下配置修改:

json
1{
2  "type": "node",
3  "request": "launch",
4  "name": "Launch via NPM",
5  "runtimeExecutable": "pnpm",
6  "args": ["run", "start:dev"],
7  "skipFiles": ["<node_internals>/**"],
8  "console": "integratedTerminal"
9}
  • runtimeExecutable :表示执行工具,可以是 npm、yarn、pnpm 等。
  • runtimeArgs :执行时的参数,对应pnpm run start:dev启动开发的脚本
  • console :让日志在 vscode 内置的终端(即integratedTerminal)打印,否则默认在DEBUG CONSOLE中打印。

然后按下 F5 进入调试模式,并在需要断点的代码左边打个断点

image-20230930125457685

在浏览器中输入http://localhost:3000/,代码就会在当前行 break 住。

image-20230930125604234

现在已经实现跟 Chrome 一样的 debug 效果了。

但是,VSC 断点调试还额外支持不同的断点模式,右键查看:

image-20230930125917484

  1. Breakpoint 即让代码停住的断点

    这种就是常用的断点方法。

  2. Conditional Breakpoint 条件断点

    条件成立时才会断住,否则就直接过去。

    image-20230930131108928

  3. Logpoint 日志断点

    如果我不想console.log查看某个变量,就可以用 Logpoint。

    image-20230930130242599

    在 log message 里写你想要看的信息,变量写在{}中, 按回车确定。

    当代码经过时,就会在控制台中输出日志:

    bash
    1result is 'Hello World!'
  4. Caught Exceptions 在没有处理异常的地方停住的断点

    等到 debug 程序启动后,勾选 Caught Exceptions(这里注意顺序,不能一开始直接勾选,否则很可能启动不了)

    image-20230930131403189

    当执行到报错行时,代码会停住。

    image-20230930132131956

总结

nest 有两种 debug 的方式:

  • 通过 Chrome 浏览器
  • 通过 IDE

nest 项目最方便的调试方式还是在 VSCode 里添加 npm run start:dev 的调试配置,除了常规的 Breakpoint 外,还有 Conditional Breakpoint、Logpoint、Caught Exceptions 这几种断点类型。

代码示例