Nest.js 初步学习
一.简介
Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用 JavaScript 的渐进增强的能力,使用并完全支持 TypeScript (仍然允许开发者使用纯 JavaScript 进行开发),并结合了 OOP (面向对象编程)、FP (函数式编程)和 FRP (函数响应式编程)。
在底层,Nest 构建在强大的 HTTP 服务器框架上,例如 Express (默认),并且还可以通过配置从而使用 Fastify !
Nest 在这些常见的 Node.js 框架 (Express/Fastify) 之上提高了一个抽象级别,但仍然向开发者直接暴露了底层框架的 API。这使得开发者可以自由地使用适用于底层平台的无数的第三方模块。
二.下载 nestjs
1.下载
(1).使用脚手架
(2).git
2.切换镜像源
如果下载速度慢或者下载过程中报错,建议使用如下代码切换镜像资源。
三.新建项目
四.平台
Nest 的目标是成为一个与平台无关的框架。平台独立性使创建可重用的逻辑部分成为可能,开发人员可以在多种不同类型的应用程序中利用这些逻辑部分。 从技术上讲,一旦创建了适配器,Nest 便可以使用任何 Node HTTP 框架。 目前支持两个 HTTP 平台:express 和 fastify。
无论使用那个平台,都会将平台的 application 接口暴露出来。它们分别是 NestExpressApplication
和 NestFastifyApplication
。
当您将类型信息传递给 NestFactory.create()
方法时,如下例所示,app
对象将具有该特定平台的专用方法。但是请注意,除非 您确实需要访问底层平台的 API,否则 无需 指定平台类型。
五.运行
六.控制器
控制器负责处理传入的请求并将响应返回给客户端
1.创建控制器的装饰器 @Controller()
2.请求
请求对象表示 HTTP 请求,并具有请求查询字符串、参数、HTTP 标头和正文的属性。在大多数情况下,没有必要手动获取这些属性。我们可以使用开箱即用的专用装饰器,例如@Body()
or 。@Query()
下面是提供的装饰器列表以及它们所代表的普通平台特定对象。
(1).动态匹配
(2).模糊匹配
假设存在路由 adcda,name 我们可以用如下方法进行模糊匹配
3.状态
默认状态为 200,我们可以使用**@HttpCode(number)**进行更改
4.重定向
要将响应重定向到特定 URL,可以使用@Redirect()
装饰器或特定于库的响应对象(并res.redirect()
直接调用)。@Redirect()接受一个必需
url参数和一个可选
statusCode参数。如果省略,则
statusCode默认为
302( )。
七.Providers(服务)
Providers 是 Nest 的一个基本概念。许多基本的 Nest 类可以被视为提供者——服务、存储库、工厂、助手等等。Providers 的主要思想是它可以注入依赖项;这意味着对象之间可以创建各种关系,并且“连接”对象实例的功能在很大程度上可以委托给 Nest 运行时系统。
1.创建
2.在其他模块使用
八.模块(@Module)
模块是一个用@Module()
装饰器注解的类。@Module()
装饰器提供了 Nest 用来组织应用程序结构的元数据。
装饰器采用@Module()
单个对象,其属性描述模块:
可将模块中导出的提供程序视为模块的公共接口或 API。
1.共享
在 Nest 中,模块默认是单例的,因此可以轻松地在多个模块之间共享任何提供程序的相同实例。
九.中间件(middleware)
中间件是在路由处理程序之前调用的函数。中间件函数可以访问请求和响应对象,以及next()
应用程序请求-响应周期中的中间件函数。下一个中间件函数通常由一个名为 的变量表示next
。
中间件函数可以执行以下任务:
执行任何代码。
更改请求和响应对象。
结束请求-响应周期。
调用堆栈中的下一个中间件函数。
如果当前中间件函数没有结束请求-响应循环,它必须调用
next()
以将控制权传递给下一个中间件函数。否则,请求将被挂起。
在 APPmodule 中引入
在 UserMiddleware 中
在 APPmodule 中引入
1.apply()
apply()
方法可以采用单个中间件,也可以采用多个参数来指定多个中间件。
2.configure()
configure()
可以使用异步方法使方法(async/await
,可以在方法主体await
内完成异步操作)
3.不包括的中间件
有时候可以排除某些路由应用中间件,使用 exclude(),此方法可以采用单个字符串、多个字符串或一个RouteInfo
标识路由的对象来排除
4.多个中间件
在**apply()**使用逗号隔开
5.全局中间件
在 main.ts 中使用**app.use()**进行使用
十.Exception filters(异常过滤器)
Nest 带有一个内置的异常层,负责处理应用程序中所有未处理的异常。
开箱即用,此操作由内置的全局异常过滤器执行,该过滤器处理类型HttpException
(及其子类)的异常。当异常无法识别(既不是HttpException
也不是继承自的类HttpException
)时,内置异常过滤器会生成以下默认 JSON 响应
1.HttpException
它可以帮助我们抛出异常
HttpException
构造函数接受两个确定响应的必需参数:
该
response
参数定义 JSON 响应正文。它可以是 astring
或 aobject
,如下所述。该
status
参数定义 HTTP 状态代码。
默认情况下,JSON 响应正文包含两个属性:
statusCode
: 默认为status
参数中提供的 HTTP 状态码message
:基于 HTTP 错误的简短描述status
第二个构造函数参数 - status
- 应该是一个有效的 HTTP 状态码。最佳做法是使用HttpStatus
从@nestjs/common
.
2.内置 HTTP 异常
Nest 提供了一组从基础继承的标准异常HttpException
。这些是从@nestjs/common
包中公开的,代表了许多最常见的 HTTP 异常:
BadRequestException
UnauthorizedException
NotFoundException
ForbiddenException
NotAcceptableException
RequestTimeoutException
ConflictException
GoneException
HttpVersionNotSupportedException
PayloadTooLargeException
UnsupportedMediaTypeException
UnprocessableEntityException
InternalServerErrorException
NotImplementedException
ImATeapotException
MethodNotAllowedException
BadGatewayException
ServiceUnavailableException
GatewayTimeoutException
PreconditionFailedException
十一.管道(Pipes)
管道是一个用@Injectable()
装饰器注解的类。管道应该实现PipeTransform
接口。
版权声明: 本文为 InfoQ 作者【木偶】的原创文章。
原文链接:【http://xie.infoq.cn/article/97648ed29155c1f6499eb90eb】。文章转载请联系作者。
评论