前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从零开始的 Nest.js

从零开始的 Nest.js

作者头像
Innei
发布2021-12-28 11:26:45
1.6K0
发布2021-12-28 11:26:45
举报
文章被收录于专栏:静之森静之森

Nest.js 久有耳闻了,但是一直没有时间去真正学习他,一直鸽子到了现在。我想借着学习 nest 的先进思想,来重构我的博客后端。

Nest.js 是一个基于 Express.js 的渐进式 Web 框架,一提到 express 很多人就觉得性能太弱,不太适合使用,但是它的生态好,也正是这一点 Nest.js 选择了 Express.js 作为底层。

Nest.js 现已支持更快的 fastify 作为底层框架

准备

首先安装 nest-cli,前往官方阅读相关内容,不多赘述。

使用 nest new server建立一个 nest 项目。

打开项目目录,我们会看到 nest-cli 帮我们建立了一个 app.module 作为根模块。app.service作为逻辑处理模块,app.controller作为控制器模块。

路由

nest 中的路由是位于一个被Controller装饰的类中,每个路由是该类中的一个方法,该方法被Get``Post等装饰器装饰,而返回的值则是响应对象。

Swagger

正是因为 nest 集成了 swagger 自动生成文档,我对他产生了非常好的影响。不用手动写文档,根据模型的字段和类型就能生成每个 api 的文档。简直不要太爽。

首先我们安装 swagger 对应的库。

代码语言:javascript
复制
1yarn add  @nestjs/swagger swagger-ui-express

COPY

app.module中加入

js

代码语言:javascript
复制
1const options = new DocumentBuilder()
2    .setTitle('Cats example')
3    .setDescription('The cats API description')
4    .setVersion('1.0')
5    .addTag('cats')
6    .build();
7  const document = SwaggerModule.createDocument(app, options);
8  SwaggerModule.setup('api', app, document);

COPY

即完成初始化。

随后在每个路由上,你也可以添加一些装饰器在路由上,swagger 会生成描述等。

在控制器对象上加上 ApiTags装饰器,即可对不同控制器加以分组。

js

代码语言:javascript
复制
1@Controller('master')
2@ApiTags('Master Routes')
3export class MasterController {
4  // ...
5}

COPY

同样如果想要某个路由在 swagger 中显示参数,则可以对参数设置一个类型,或是一个 Dto 模型。比如:

js

代码语言:javascript
复制
1// user.controller.ts
2@Post('/sign_up')
3  async register(@Body() userDto: UserDto) {
4    return await this.masterService.createMaster()
5  }

COPY

js

代码语言:javascript
复制
1// user.dto.ts
2import { ApiProperty } from '@nestjs/swagger'
3
4export class UserDto {
5  @ApiProperty()
6  readonly username: string
7
8  @ApiProperty()
9  readonly password: string
10}

COPY

只要属性被 ApiProperty装饰,该属性就会被 swagger 读取。

https://cdn.jsdelivr.net/gh/innei/img-bed@master/20200321161859.png
https://cdn.jsdelivr.net/gh/innei/img-bed@master/20200321161859.png
https://cdn.jsdelivr.net/gh/innei/img-bed@master/20200321161939.png
https://cdn.jsdelivr.net/gh/innei/img-bed@master/20200321161939.png

请求过滤

nest 同样提供了强大了请求过滤,你可以使用之前为 swagger 准备的 Dto 模型,在此基础上加以扩展,即可对请求体的模型进行验证。验证通过 nest 的管道(Pipe)。

首先安装 class-validator,之后 main.ts 中引入全局管道 ValidationPipeValidationPipe是 nest 提供的一个类似于Joi之类的 Schema 验证器,他通过调用 class-validator来识别该属性是否正确或者需要,已阻止不必要的 nosql 注入。

js

代码语言:javascript
复制
1async function bootstrap() {
2  const app = await NestFactory.create(AppModule)
3
4  app.useGlobalPipes(
5    new ValidationPipe({
6      whitelist: true, // 白名单模式,过滤 dto 中未定义的属性
7      transform: true, // 自动转换,比如 req.age = "12" => req.age = 12
8    }),
9  )
10  // ...
11}

COPY

在之前的 Dto 中,稍加扩展。

js

代码语言:javascript
复制
1// user.dto.ts
2import { ApiProperty } from '@nestjs/swagger'
3import {
4  IsString,
5  IsNotEmpty,
6} from 'class-validator'
7export class UserDto {
8  @ApiProperty()
9  @IsString()
10  @IsNotEmpty()
11  readonly username: string
12
13  @IsString()
14  @ApiProperty()
15  @IsNotEmpty()
16  readonly password: string
17
18}

COPY

再次请求接口。

/user/login接口发起一个 nosql 注入请求

代码语言:javascript
复制
1{
2  "username": "admin",
3  "password": {"$gt": 1}
4}

COPY

得到了一个 400 响应。

https://cdn.jsdelivr.net/gh/innei/img-bed@master/20200321163058.png
https://cdn.jsdelivr.net/gh/innei/img-bed@master/20200321163058.png

通过这种方式,可以少些很多判断类型的代码。实在是高。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备
  • 路由
  • Swagger
  • 请求过滤
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档