【前端调试】如何优雅调试Nest

如何通过VsCode优雅调试Nest

调试能力是衡量一个开发者水平的重要指标,在编写应用的时候,首先应该要知道如何调试应用,通过调试,我们可以清晰看到程序在运行过程中的裸奔状态。

接下来,通过调试请求过程和异常信息来演示VsCode如何调试Nest

创建launch.json

点击调试,创建launch.json调试文件

选择Node.js调试器

修改program地址为入口文件

json 复制代码
{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "启动程序",
            "skipFiles": [
                "<node_internals>/**"
            ],
            "program": "${workspaceFolder}/src/main.ts",
            "outFiles": [
                "${workspaceFolder}/**/*.js"
            ]
        }
    ]
}

切换开关自动附加(Toggle Auto Attach)

服务启动时自动开启debug服务

Mac中通过command + shift + control打开命令行窗口,输入Toggle Auto Attach

选择总是

这时候状态栏红会出现自动附加:始终

这时候运行Nest服务的时候,自动拉起debugger服务,那么两个服务共享一个端口

此时可以看到debug栏中已经启动了调试服务

这时候,我们通过前端发送一个请求来测试一下调试效果,在匹配到POST请求路由的时候进行断点

点击按钮获取nest返回的数据

此时,会自动定位到断点位置,并且能够成功拿到前端post的数据。

接下来再看一下异常情况,修改一下前端传递name参数的类型为number类型

正常情况会抛出异常(DTO验证),被全局异常拦截器捕获,并且可以看到具体的错误信息!

手动开启debug服务

很多时候不希望跑dev服务的时候直接开启调试,毕竟在一些机器上占用多一个进程会导致VsCode变卡,所以在需要的时候手动开启调试。

将自动附加设置为禁用

手动启动调试服务,依然可以进入正常的debug

需要注意的是,这时候不用手动启动nest dev服务,否则会导致两个服务的端口冲突。细心的朋友可以留意到两种方式启动的时候,左边调用堆栈运行的程序跟前面的是有区别的

调试源码

了解了这两种调试方式之后,也可以直接来调试源码,比如调试一下nestPost装饰器是如何实现的?

Post装饰器打个断点,重新启动调试

这里的程序会在node初始化模块的时候断住

说到这里,稍微扩展一下,通过这种调试方式,是可以看到node在加载和执行模块的流程原理,怎么看呢?

点开这个调用栈信息

可以看到node首先是通过Module.load加载模块,而这里加载的是js模块,然后根据sourceMap定位到具体TS源码的位置,所以断点可以直接在TS源码中进行断住。

Module._extensions判断文件类型进行读取操作,node中读取文件都是字符串的,所以很多工具底层其实是直接对字符串进行操作,例如通过拦截这个方法实现批量脱敏的操作。

Module._compile对文件进行编译、设置断点等操作

--inspect-brk这个也是一种调试方式,它会在代码启动的首行进行断住,这里就不牵扯太多了,扩展这个只是为了说了通过调试可以一步一步看程序是如何运行的,这是学习其他框架源码非常有效的方式。

再回来看一下@Post是如何实现的?进入函数内部看看

这里是一个装饰器工厂,接收不同的请求类型和路由参数,看到这里基本上就能够结合ES6 decorate自己实现一个类似的装饰器。

再进入一层就涉及到元数据-metedata相关的知识点了,在Vue2中使用reflect-metadata包实现类似Vue3 compositionAPI的编码风格就是利用这玩意儿,这里不再展开说啦~

总结

通过上面两种调试方式可以轻松的对Nest应用进行调试,根据自身的实际情况进行选择。当然,我们在调试源码的过程中也还发现了另外一种--inspect-brk命令行断点方式,类似的还有--inspect方式,掌握了以上技巧,code中遇到问题就不用侵入式每个地方进行console

相关推荐
前端杂货铺2 天前
NestJS——日志、NestJS-logger、pino、winston、全局异常过滤器
nestjs·日志
林太白22 天前
NestJS用户模块CRUD和分页实现
前端·javascript·nestjs
plusone22 天前
【Nest指北系列-源码】(一)目录结构
nestjs
前端笨鸟1 个月前
NestJS+MongoDB高效CRUD接口开发全景指南
前端·mongodb·nestjs
前端实习生鲸落1 个月前
nest 静态文件打包
前端·node.js·nestjs
汪小成1 个月前
NestJS学习笔记-03-使用class-validator进行接口参数校验🚀
后端·nestjs
汪小成1 个月前
NestJS学习笔记-02-模块、控制器与服务,手把手构建你的第一个CRUD API!🚀
后端·nestjs
汪小成1 个月前
NestJS学习笔记-01-第一个Nest应用诞生记 🚀
后端·nestjs
plusone1 个月前
【Nest指北系列】守卫
nestjs
用户11481867894841 个月前
大文件下载、断点续传功能
前端·nestjs