【前端调试】如何优雅调试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

相关推荐
_jiang2 天前
nestjs 入门实战最强篇
redis·typescript·nestjs
敲代码的彭于晏4 天前
【Nest.js 10】JWT+Redis实现登录互踢
前端·后端·nestjs
前端小王hs18 天前
Nest通用工具函数执行顺序
javascript·后端·nestjs
明远湖之鱼20 天前
从入门到入门学习NestJS
前端·后端·nestjs
吃葡萄不吐番茄皮22 天前
从零开始学 NestJS(一):为什么要学习 Nest
前端·nestjs
东方小月23 天前
Vue3+NestJS实现权限管理系统(六):接口按钮权限控制
前端·后端·nestjs
白雾茫茫丶25 天前
Nest.js 实战 (十四):如何获取客户端真实 IP
nginx·nestjs
Spirited_Away1 个月前
Nest世界中的AOP
前端·node.js·nestjs
Eric_见嘉1 个月前
NestJS 🧑‍🍳 厨子必修课(六):Prisma 集成(下)
前端·后端·nestjs
kongxx2 个月前
NestJS中使用Guard实现路由保护
nestjs