nestjs-基础

一、nestjs是一门什么技术?

nestjs是一个用于构建高效、可扩展的Node.js服务器端应用程序的开发框架。它利用 JavaScript 的渐进增强的能力,使用并完全支持TypeScript,并结合了 OOP (面向对象编程)、FP (函数式编程)和 FRP (函数响应式编程)。

在底层,Nest 构建在强大的 HTTP 服务器框架上,例如 Express,并且还可以通过配置从而使用Fastify

nestjs在这些常见的Node.js框架之上提高了一个抽象级别,但仍然向开发者直接暴露了底层框架的 API。这使得开发者可以自由地使用适用于底层平台的无数的第三方模块

二、nestjs与传统node服务端框架的区别(koa,express等)

传统的node服务端框架,例如express,主要是应用于轻量项目。这种框架有个很明显的特点,那就是代码的风格很难统一,开发者可以根据自己的编程习惯任意的调整中间件,需要团队内人为约定来进行风格的统一。当进入多人开发的时候,管理起来很麻烦。

nestjs与传统node服务端框架最为明显的区别就是提供的一个"架构"的概念。nestjs提供了一些内置好的对象,这些对象会强制约束开发者必须按照nestjs的规范来进行开发。

nestjs是使用ts进行开发的,因此对ts有着完全的支持。如果使用ts进行nestjs项目开发,那么在开发方式上就很类似于springboot框架。nestjs框架大量使用了装饰器来进行类的封装,并且整个框架使用IOC的模式来设计,依赖注入贯穿整个框架

三、nestjs的核心概念

  • controller

controller作为服务的控制器,相当于路由层,使用@Controller装饰器进行修饰

@Controller('cats')
export class CatsController {
  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }
}

示例中的controller可以提供一个Get请求的接口,请求路径为cats。当客户端访问/cats时,会直接映射到findAll方法。

  • provider

provider是一个概念,泛指一些可以作为依赖进行注入的对象@Injectable装饰器进行修饰。

@Injectable()
export class CatsService {
  private readonly cats: Cat[] = [];
  create(cat: Cat) {
    this.cats.push(cat);
  }
}

@Controller('cats')
export class CatsController {
  constructor(private catsService: CatsService) {}

  @Post()
  async create(@Body() createCatDto: CreateCatDto) {
    this.catsService.create(createCatDto);
  }
}

在上述示例中,CatsService被@Injectable装饰器修饰,因此是一个provider。在CatsController内部需要CatsService进行服务处理,那么CatsService被就可以按需自动的注入到CatsController内。在使用nestjs进行开发时,是不会使用new关键字对Controller进行对象创建的,因此构造器里面的参数都是框架通过IOC自动注入的

  • module

一个module可以看作一个黑盒,包含了provider和controller。provider进行注入时,除非这个provider是全局provider,不然只能在module内进行作用。简单来说,一个module内部的controller需要一个service,如果这个module内有这个service,那么就能自动注入,没有则进行全局查找进行注入,还是没有则会报出依赖错误

扫描二维码关注公众号,回复: 15089914 查看本文章
@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService]
})
export class CatsModule {}

module使用@Module装饰器进行修饰,还可以导入别的模块或导出自身的provider,这样可以实现provider的跨module使用。

四、一个http请求的生命周期

当一个nestjs的服务启动后,从接收到请求再返回响应结果,一般会经过如下几个阶段

未命名文件 (15).png

一个正常的请求流程如下:

收到请求 -> 中间件 -> 导航守卫 -> 拦截器 -> 管道 -> 处理方法 -> 拦截器 -> 响应请求

任何一个环节抛出了未捕获的异常,都会被异常层捕获,然后直接响应请求。

基于这个生命周期的特性,每一个环节都可以进行设计用于处理一些公共的事务。比如

  • 中间件

收集所有的请求日志或其他一些公共的前置处理

  • 导航守卫

鉴权处理,针对不同的路由,采用不同的鉴权方案

  • 拦截器

利用方法体结束后会回到拦截器的特性,可以统一所有的数据返回格式

  • 管道

统一的参数格式与合法性校验

  • 异常层

异常统一处理,返回统一的异常数据格式

上述处理只是个人在使用单应用架构时的一些使用心得,针对不同的项目,或者使用微服务架构,接入了API网关。那么每一个环节的处理又需要按需调整。

以上只是一个笼统的简单的描述,每个环节其实都还可以继续细分,比如是否全局的,控制器级别的甚至方法级别的,这可以根据项目进行更加细粒化的设计。

五、总结

对于一个前端开发者而言,如果想涉及后端,那么nestjs是一个不错的选择。nestjs的上手难度较高,同时也和传统的前端开发模式有较大差异,但也可以让开发者学会以后端的思想编写代码。

基于node的事件循环机制主要基于libuv来实现,因此nestjs在I/O密集型场景下会有比较大的优势,但也是因为node的单线程设计,nestjs不适用于工作量比较大的工作。

总的来说,nestjs算是一门前端开发者初涉后端技术的一个不错选择。

猜你喜欢

转载自juejin.im/post/7233661164214550585