一、框架介绍
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 框架组织应用结构的原信息。
每个应用都至少有个 Module 作为 Root Module,这是 Nestjs 框架构建、解析应用的起点。@Module 注解使用对象来描述 Module,整体的应用应该是有多个 Module 构成的
属性 | 详情 |
providers | 当前 Service 可以被注入到当前模块中使用 |
controllers | 该模块中所有涉及请求的 Controller |
imports | 导出此模块所需的提供程序的导入的依赖的模块列表 |
exports | 是当前 providers 的子集,当其他模块导入此模块时,可以提供 exports 内部的 |
Service | 可以将模块中导出的提供程序视为模块的公共接口或 API |
五、Middleware
Middleware 是一个在 Router 处理前被调用的函数,这个函数能够访问 request、response、next 三个变量对象
执行一些代码逻辑
有机会改变 request 和 response 对象
结束当前响应
调用 next() 方法,进入后续的流程
如果当前中间件没有当前响应活着没有调用 next() 方法,该请求将挂起
Middleware 与 Guards 的切入点是一样的,Guards 能够获取到上下文信息,更关注此操作是否放行
Middleware 获取不到上下文信息,更关注在处理请求到达之前做一些事情
六、Exception filters
Nest 带有一个内置的异常层,负责处理整个应用程序中所有未处理的异常。当您的应用程序代码未处理异常时,该层会捕获该异常,然后该层会自动发送适当的用户友好响应。
一般可以实现根据自己的业务,实现特定的异常类
七、Pipes (管道)
Pipes 是由 @Injectable() 装饰的实体类,并且需要实现 PipeTransform 接口
转化输入的数据到需要的数据结构
验证输入数据,如果有效,只需传递它;否则抛出相应的异常,一般用于 Controller 层
一些常用的内置 Pipes
PiPe | 详情 |
ValidationPipe | 验证传入数据 |
ParseIntPipe | 输入转 Int 类型 |
ParseFloatPipe | 输入转 Float 类型 |
ParseBoolPipe | 输入转 Bool 类型 |
ParseArrayPipe | 输入转 Array 类型 |
ParseUUIDPipe | 输入转 UUID 类型 |
ParseEnumPipe | 输入转 Enum 类型 |
DefaultValuePipe | 制定默认值 |
八、Guards (守卫)
Guards 是由 @Injectable() 装饰的实体类,并且需要实现 CanActivate 接口
Guards 有一个单一的责任。它们根据运行时存在的某些条件(如权限、角色等)确定给定的请求是否将由路由处理程序处理
九、Interceptors (拦截器)
Interceptors 是由 @Injectable() 装饰的实体类,并且需要实现 NestInterceptor 接口
在方法执行的前后,绑定额外的逻辑(支持Rxjs)
转换从函数的结果返回
转换从函数抛出的异常
扩展基础函数的行为
根据特定条件完全覆盖函数(例如,出于缓存目的)
能完全切入请求处理前后,进行额外的操作处理
十、Custom route decorators (自定义路由注解)
用于将逻辑数据绑定到请求对象。然后在每个路由处理程序中手动提取它们