一、框架介绍

Nestjs 是以用于构建高可用可伸缩的后端应用框架,并且全面支持 Typescript

在背后,Nestjs 使用了强大的 http 框架 (默认是 express),并且可以配置选择其他的 Http 服务框架

二、Controllers 和 Router

Controller 主要是用于处理服务端请求,并且返回服务端的响应

Controller 的主要目标是接受服务请求,Router 机制控制哪个控制器接收哪个请求,一般来说一个 Controller 可以配多个 Route,不同的 Route 能够形成不同的动作。在 Nestjs 框架中,我们使用 Class 和 Decorators ,Nestjs 内部会根据 Decorator metadata 创建路由映射

一些相关的注解

注解

详情

@Request(), @Req()

req

@Response(), @Res()*

res

@Next()

next

@Session()

req.session

@Param(key?: string)

req.params / req.params[key]

@Body(key?: string)

req.body / req.body[key]

@Query(key?: string)

req.query / req.query[key]

@Headers(name?: string)

req.headers / req.headers[name]

@Ip()

req.query / req.ip

@HostParam()

req.hosts

三、Providers 和 Services

Providers 是 Nestjs 中一个极为实用的概念,他的主要意义的能够作为依赖被注入使用。这意味着对象之间可以创建各种关系,“连接”对象实例的功能可以在很大程度上委托给 Nest 运行时系统(Nestjs 框架本身提供了依赖管理注入的功能)

Services 是 Nestjs 框架中负责处理业务逻辑的部分,它通常会被 @Injectable 修饰成为 Provider,供 Controller 注入使用

四、Modules

Modules 是一个被 @Module 装饰的 Class,@Module 提供了 Nestjs 框架组织应用结构的原信息。

nestjs状态码201_nestjs状态码201

每个应用都至少有个 Module 作为 Root Module,这是 Nestjs 框架构建、解析应用的起点。@Module 注解使用对象来描述 Module,整体的应用应该是有多个 Module 构成的

属性

详情

providers

当前 Service 可以被注入到当前模块中使用

controllers

该模块中所有涉及请求的 Controller

imports

导出此模块所需的提供程序的导入的依赖的模块列表

exports

是当前 providers 的子集,当其他模块导入此模块时,可以提供 exports 内部的

Service

可以将模块中导出的提供程序视为模块的公共接口或 API

五、Middleware

Middleware 是一个在 Router 处理前被调用的函数,这个函数能够访问 request、response、next 三个变量对象

nestjs状态码201_前端_02


执行一些代码逻辑



有机会改变 request 和 response 对象



结束当前响应



调用 next() 方法,进入后续的流程



如果当前中间件没有当前响应活着没有调用 next() 方法,该请求将挂起

Middleware 与 Guards 的切入点是一样的,Guards 能够获取到上下文信息,更关注此操作是否放行
Middleware 获取不到上下文信息,更关注在处理请求到达之前做一些事情

六、Exception filters

Nest 带有一个内置的异常层,负责处理整个应用程序中所有未处理的异常。当您的应用程序代码未处理异常时,该层会捕获该异常,然后该层会自动发送适当的用户友好响应。

nestjs状态码201_javascript_03

一般可以实现根据自己的业务,实现特定的异常类

七、Pipes (管道)

Pipes 是由 @Injectable() 装饰的实体类,并且需要实现 PipeTransform 接口

nestjs状态码201_ide_04


转化输入的数据到需要的数据结构



验证输入数据,如果有效,只需传递它;否则抛出相应的异常,一般用于 Controller 层

一些常用的内置 Pipes

PiPe

详情

ValidationPipe

验证传入数据

ParseIntPipe

输入转 Int 类型

ParseFloatPipe

输入转 Float 类型

ParseBoolPipe

输入转 Bool 类型

ParseArrayPipe

输入转 Array 类型

ParseUUIDPipe

输入转 UUID 类型

ParseEnumPipe

输入转 Enum 类型

DefaultValuePipe

制定默认值

八、Guards (守卫)

Guards 是由 @Injectable() 装饰的实体类,并且需要实现 CanActivate 接口

nestjs状态码201_前端_05

Guards 有一个单一的责任。它们根据运行时存在的某些条件(如权限、角色等)确定给定的请求是否将由路由处理程序处理

九、Interceptors (拦截器)

Interceptors 是由 @Injectable() 装饰的实体类,并且需要实现 NestInterceptor 接口

nestjs状态码201_ide_06


在方法执行的前后,绑定额外的逻辑(支持Rxjs)



转换从函数的结果返回



转换从函数抛出的异常



扩展基础函数的行为



根据特定条件完全覆盖函数(例如,出于缓存目的)



能完全切入请求处理前后,进行额外的操作处理

十、Custom route decorators (自定义路由注解)

用于将逻辑数据绑定到请求对象。然后在每个路由处理程序中手动提取它们