Nest基于 Express 这种http平台做了一层 封装 ,应用了 MVC,IOC,AOP 等架构思想. MVC 就是Model,View,Controller的划分,请求会先经过 controller ,然后调用 model层的service和repository完成业务逻辑 ,最后 返回对应的view . IOC 是指Nest会自动扫描带有 @Controller,@Injectable 装饰器的类,然后会创建出它们的对象,并根据 依赖关系自动注入它所依赖的对象 ,免去了手动创建和组装对象的麻烦. AOP 则是吧 通用逻辑抽离出来 ,通过 切面的方式添加到某个地方 ,可以复用和动态的增删切面逻辑. Nest的 middleware, guard, interceptor, pipe, exceptionFilter 都是AOP思想的实现,只不过是 不同位置 的切面,它们都是可以作用在某个路由或者全部路由,这就是AOP的优势. Nest就是通过这种AOP的架构方式,实现了 松耦合,易于维护和扩展 的架构.
模块可以通过 @Global 装饰器声明为全局的,在该模块 exports 的 provider 就可以在任意模块中被使用了,不需要 imports . provider,controller,module 都支持启动和销毁的生命周期函数,掌握生命周期函数的调用顺序(这些生命周期函数都支持异步).
在一般情况下, provider 就是被 @Injectable 装饰器修饰,然后在 @Module 装饰器中的 providers 数组里注册的 class . 默认的 token 就是 class ,这样不用使用 @Inject 装饰器来手动指定要注入的 token . 但 token 也可以自定义,自定义的token必须使用 @Inject 装饰器单独指定对应的 自定义token . 除了可以用 useClass 指定注入的 class , 还可以使用 useValue 指定自定义对象. 如果想动态生成对象,可以使用 useFactory ,它的参数也可以注入 IOC容器中的对象 ,然后返回 provider 的对象.
复杂的代码需要使用断点调试查看调用栈和作用域,也就是代码的执行路线,然后单步执行. node代码可以加上 --inspect或--inspect-brk启动调试ws服务 ,然后用chome devtools或者vscode debugger调试. nest项目的调试也是node调试,可以使用 nest start --debug 启动ws服务 ,然后在vscode里 attach 来调试,也可以添加一个 npm scripts 调试配置来运行 npm run start:dev . nest项目最方便的调试方式 是在VSCode里添加npm run start:dev 的调试配置.
后端系统有很多的对象,这些对象之间的关系错综复杂,如果手动创建并组装对象比较麻烦,所以后端框架一般都提供了IOC机制. IOC机制是在Class上标识出有哪些是可以被注入的,它的依赖是什么. 然后从入口开始扫描这些对象和依赖, 自动创建和组装对象. Nest里通过@Controller装饰器来声明可以被注入的controller, 通过@Injectable装饰器声明可以被注入也可以注入到别的对象的provider, 然后在@Module装饰器声明的模块中引入. 虽然Nest这套实现了IOC的模块机制看起来繁琐, 但却解决了后端系统的对象依赖关系错综复杂的痛点问题.
了解HTTP常见的5种数据传输方式,通过axios发送请求使用Nest启动后端服务,实战5种数据传输方式.
@nestjs/cli包里提供了nest命令,它可以用来做很多事情.本文介绍了如何使用nest生成项目结构和各种代码/编译代码/监听文件变动自动编译/打印项目依赖信息等.