nest

2022/02/26 后端 共 2386 字,约 7 分钟

nest 简介

Nest.js 是一个 MVC 框架,提供了 Module、Controller、Service 的逻辑划分,也实现了 IOC 模式,集中管理对象和自动注入依赖。

Controller:传统意义上的控制器,提供 api 接口,负责处理路由、中转、验证等一些简洁的业务;

Service:又称为 Provider, 是一系列服务、repo、工厂方法、helper 的总称,主要负责处理具体的业务,如数据库的增删改查、事务、并发等逻辑代码,基于 Typeorm 的增删改查功能来实现各种上层业务逻辑,不要在这个

Module:负责将 Controller 和 Service 连接起来,类似于 namespace 的概念;

千万不要往 Controller 里面添加乱七八糟的东西,尤其不要在里面写业务逻辑,Controller 就应该保持简洁、干净

imports: 导入模块

exports: 导出服务(这里不要导出模块,容易出现循环依赖)

Controller 和 Service 处于完全解耦的状态:Controller 做的事情仅仅是接收请求,并在合适的时候调用到 Service,至于 Service 内部怎么实现的 Controller 完全不在乎。

这样以来有两个好处:其一,Controller 和 Service 的职责边界很清晰,不存在灰色地带;其二,各自只关注自身职责涉及的功能,比方说 Service 通常来写业务逻辑,但它也仅仅只与业务相关。当然你可能会觉得这很理想,时间长了增加了诸如缓存、验证等逻辑后,代码最终会变得无比庞大而难于维护。事实上这也是一个框架应该考虑和抽象出来的,后续 Nest 会有一系列的解决方法,但目前为至我们只需要了解到 Controller 和 Service 的设计原理即可。

HTTP 方法提供了相应的装饰器

Nest 为所有标准的 HTTP 方法提供了相应的装饰器:@Post(),@Get(),@Put()、@Delete()、@Patch()、@Options()、以及 @Head()。此外,@All() 则用于定义一个用于处理所有 HTTP 请求方法的处理程序。

我们可以通过在处理函数外添加 @HttpCode(…) 装饰器来轻松更改此行为。 @Post() @HttpCode(204) create() { return ‘This action adds a new cat’; }

指定自定义响应头:@Header @Post() @Header(‘Cache-Control’, ‘none’) create() { return ‘This action adds a new cat’; }

 响应重定向到特定的 URL @Redirect() @Get() @Redirect(‘https://nestjs.com’, 301)

路由动态参数@Param()  @Get(‘:id’) findOne(@Param() params): string { console.log(params.id); return This action returns a #${params.id} cat; }

请求负载 使用typescript,我们需要确定DTO(数据传输对象)模式,DTO定义了网络发送数据的格式

管道

对参数做验证,在 Controller 里就可以,但是这种验证逻辑是通用的,每个 Controller 里都做一遍也太麻烦了,我们可以在 Controller 之前就做,使用管道(Pipe)。,它会在请求到达 Controller 之前被调用,可以对参数做验证和转换,如果抛出了异常,则不会再传递给 Controller。这种管道的特性适合用来做一些跨 Controller 的通用逻辑,比如 string 的 int 的转换,参数验证等等。

管道有两个类型: 转换:管道将输入数据转换为所需的数据输出 验证:对输入数据进行验证,如果验证成功继续传递; 验证失败则抛出异常; 在这两种情况下, 管道 参数(arguments) 会由 控制器(controllers)的路由处理程序 进行处理. Nest 会在调用这个方法之前插入一个管道,管道会先拦截方法的调用参数,进行转换或是验证处理,然后用转换好或是验证好的参数调用原方法。

Nest 自带八个开箱即用的管道,即

ValidationPipe

ParseIntPipe

ParseBoolPipe

ParseArrayPipe

ParseUUIDPipe

DefaultValuePipe

ParseEnumPipe

ParseFloatPipe

类验证器

class-transformer 库。它和 class-validator 库由同一个作者开发transform() 函数是 异步 的, Nest 支持同步和异步管道。这样做的原因是因为有些 class-validator 的验证是可以异步的(Promise)

Class-validator 类型验证,class-transformer类型转换

app.useGlobalPipes(new ValidationPipe({ transform: true, whitelist: true }));

whitelist: 如果设置为 true ,验证器将去掉没有使用任何验证装饰器的属性的验证(返回的)对象

ValidationPipe 可以根据对象的 DTO 类自动将有效负载转换为对象类型。若要启用自动转换,请将 transform 设置为 true

异常过滤器

app.useGlobalFilters(new DatabaseExceptionFilter());

守卫

守卫是一个使用 @Injectable() 装饰器的类 守卫应该实现 CanActivate 接口 。它们根据运行时出现的某些条件(例如权限,角色,访问控制列表等)来确定给定的请求是否由路由处理程序处理。 这通常称为授权

守卫在每个中间件之后执行,但在任何拦截器或管道之前执行。

与管道和异常过滤器一样,守卫可以是控制范围的、方法范围的或全局范围的


在技术的历史长河中,虽然我们素未谋面,却已相识已久,很微妙也很知足。互联网让世界变得更小,你我之间更近。

在逝去的青葱岁月中,虽然我们未曾相遇,却共同经历着一样的情愫。谁的青春不曾迷茫或焦虑亦是无奈,谁不曾年少过

在未来的日子里,让我们共享好的文章,共同学习进步。有不错的文章记得分享给我,我不会写好的文章,所以我只能做一个搬运工

我叫 sunseekers(张敏) ,千千万万个张敏与你同在,18年电子商务专业毕业,毕业后在前端搬砖

如果喜欢我的话,恰巧我也喜欢你的话,让我们手拉手,肩并肩共同前行,相互学习,互相鼓励

文档信息

Search

    Table of Contents