迹忆客 专注技术分享

当前位置:主页 > 学无止境 > WEB前端 >

如何在 NestJS 中使用 DTO 进行验证

作者:迹忆客 最近更新:2023/02/01 浏览次数:

这里我们将讨论 NestJS 中的数据传输对象 (DTO) 以及如何使用它们来验证请求。

什么是 DTO?

DTO 本身更多的是为开发人员和使用 API 的人提供指导,以了解请求主体期望的形状,它实际上并没有自己运行任何验证。

但是,使用 TypeScript,我们可以使用内置的验证管道从类验证器库中添加装饰器,并对传入的请求运行验证,以便只有预期的请求可以进入。

开始开发

首先,我们要安装 NestJS CLI,所以打开您选择的终端并输入:

$ npm i -g @nestjs/cli

我们用它的 CLI 初始化一个新的 NestJS 项目。 这可能需要一分钟。 CLI 脚本将询问我们要使用的包管理器。 对于此示例,我选择 NPM。

$ nest new nest-dto-validation

完成此命令后,我们可以在代码编辑器中打开项目。 由于我使用 Visual Studio Code,我将通过键入以下内容打开项目:

$ cd nest-dto-validation
$ code .

visual code 打开nest.js

让我们安装一些依赖项。

$ npm i class-validator class-transformer

现在,让我们开始编码。 首先,我们将 ValidationPipe 添加为全局管道。 以下是对其属性的解释:

  • whitelist :删除请求正文中不在 DTO 中的所有属性
  • transform :这个属性将允许我们将属性转换,例如,将整数转换为字符串。 我们今天不讨论这个。

将 src/main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();

更改为

import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

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

  await app.listen(3000);
}
bootstrap();

修改 main.ts 后,我们需要在 src/ 目录中创建一个名为 app.dts.ts 的新文件。 可以通过以下命令添加它(Mac、Linux):

$ touch src/app.dto.ts

我们要将此内容添加到 src/app.dts.ts 。 该文件将负责验证。 我在文件中添加了一些注释。

import { ArrayMinSize, IsArray, IsBoolean, IsNotEmpty, IsNumber, IsOptional, IsString } from 'class-validator';

export class FormDto {
  // 验证非空字符串
  @IsString()
  @IsNotEmpty()
  public name: string;

  // 仅在它是请求正文的一部分时才进行验证
  @IsString()
  @IsNotEmpty()
  @IsOptional()
  public email: string;

  // 验证整数
  @IsNumber()
  public age: number;

  // 验证整数
  @IsBoolean()
  public acceptedTOS: boolean;

  // 验证非空整数数组
  @IsArray()
  @IsNumber({ allowNaN: false }, { each: true })
  @ArrayMinSize(1)
  public nums: number[];
}

最后但同样重要的是,我们需要修改 src/app.controller.ts 文件。 我们为 POST 请求添加了一个新的路由处理程序。 如大家所见,我们将在上一步中刚刚创建的 FormDTO 类添加为我们的表单类型。

让我们将 src/app.controller.ts 从下面的内容

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

更改为

import { Body, Controller, Get, Post } from '@nestjs/common';
import { FormDto } from './app.dto';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  public getHello(): string {
    return this.appService.getHello();
  }

  @Post()
  public form(@Body() body: FormDto): FormDto {
    return body;
  }
}

就是这样! 现在让我们测试我们的新 POST 路由。 我们可以使用 Postman 等软件,也可以在终端中使用 CURL 命令。

$ curl -X POST http://localhost:3000 -H "Content-Type: application/json" -d '{"age": 1, "name": "Elon Musk", "acceptedTOS": true, "nums": [2]}'

服务端响应如下

{"age":1,"name":"Elon Musk","acceptedTOS":true,"nums":[2]}

太好了,它有效。 现在让我们发送相同的请求,但让我们稍微改变一下正文。 如大家所知,我们需要一个整数作为年龄属性。 所以这次我们要将年龄作为字符串发送:

$ curl -X POST http://localhost:3000 -H "Content-Type: application/json" -d '{"age": "1", "name": "Elon Musk", "acceptedTOS": true, "nums": [2]}'

服务端响应如下

{"statusCode":400,"message":["age must be a number conforming to the specified constraints"],"error":"Bad Request"}

任务完成! 正如预期的那样,我们得到了 400 错误响应。

感谢阅读关于 NestJS 验证的文章。 希望您了解 DTO 现在是如何工作的。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Nest.JS 用户注入详细介绍

发布时间:2022/04/23 浏览次数:260 分类:WEB前端

Nest.JS 是最流行的 Node.js 框架。 它利用 TypeScript 的全部功能使开发过程快速而简单。 在本文中,我将分享非常酷且有用的技巧“用户注入(User Injection)”,它可以大大简化我们的 Nest.JS

在 NestJS 中实现外部定义的配置设置

发布时间:2022/04/21 浏览次数:498 分类:WEB前端

你可能已经花了一些时间使用了很棒的 NestJS 框架,现在是时候看看如何为你的配置设置获取一些外部定义的值,比如一些键或全局变量

如何在 NestJS 中使用版本控制

发布时间:2022/04/19 浏览次数:316 分类:WEB前端

NestJS 是一个用于构建 Node.js 服务器端应用程序的框架。我不会在本文中详细介绍 NestJS 是什么以及为什么要使用它,但我建议查看他们的文档!版本控制已添加到 2021 年 7 月发布的 Nes

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便