19_管道——验证DTO

简介: 19_管道——验证DTO

获取管道元数据

DTO允许我们通过管道验证请求参数是否符合我们的要求,首先我们要获取管道的元数据

  1. 通过nest g pi login命令为login创建一个管道元数据获取模块
import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common';
@Injectable()
export class LoginPipe implements PipeTransform {
  transform(value: any, metadata: ArgumentMetadata) {
    console.log(value,metadata) // { name: 'Su Yihang', age: 20 } { metatype: [class CreateLoginDto], type: 'body', data: undefined }
    return value;
  }
}
  1. 在controller里注册
@Controller('login')
export class LoginController {
  constructor(private readonly loginService: LoginService) {}
  @Post()
  // 直接丢到Body里即可。这行代码可以理解为:将通过Body装饰器取出的内容通过LoginPipe加工,加工后的数据类型必须是CreateLoginDto
  create(@Body(LoginPipe) createLoginDto: CreateLoginDto) {
    return this.loginService.create(createLoginDto);
  }
}

接下来用POST请求访问localhost:3000/login即可打印出元数据

DTO验证并在错误时返回信息

import { ArgumentMetadata, HttpException, HttpStatus, Injectable, PipeTransform } from '@nestjs/common';
import { plainToInstance } from 'class-transformer';
import { validate } from 'class-validator';
@Injectable()
export class LoginPipe implements PipeTransform {
  // transform方法的第一个参数是请求参数,第二个是元数据,其中包含CreateLoginDto类
  async transform(value: any, metadata: ArgumentMetadata) {
    console.log(value, metadata);   // { name: 'Su Yihang', age: 20 } { metatype: [class CreateLoginDto], type: 'body', data: undefined }
    // 通过plainToInstance方法将value值反射到metadata.metatype(CreateLoginDto类)上
    const DTO = plainToInstance(metadata.metatype, value);
    console.log(DTO)  // CreateLoginDto { name: 'Su Yihang', age: 20 }
    // validate方法
    const errors = await validate(DTO)  // validate方法返回错误信息(即请求参数和CreateLoginDto类型限制不符合的部分)
    if(errors){
      // 如果为空则为空数组,否则数组中会包含错误信息
      console.log(errors)
      // 抛出错误信息
      throw new HttpException(errors,HttpStatus.BAD_REQUEST)
    }
    return value;
  }
}

以上即为DTO验证全过程

nest.js自带的全局DTO验证

无需上面的繁琐过程,直接在main.ts里来两句

// 引入全局管道DTO
import { ValidationPipe } from '@nestjs/common';
async function bootstrap() {
  const app = await NestFactory.create<NestExpressApplication>(AppModule);
  // 使用全局管道(记得实例化)
  app.useGlobalPipes(new ValidationPipe())
  await app.listen(3000);
}
bootstrap();

目录
相关文章
|
网络协议 网络架构
数据从发出到接收的细节介绍{封装与解封装}
本文将介绍了详细的封装在每一层的具体的操作,可以让大家学习到数据从发出到收到的具体过程。
|
JSON Java Apache
Bean自动映射工具对比及VO、DTO、PO、DO对象之间的转换
在实际的开发过程中,常常遇到各个层之间对象转换,比如 VO、DTO、PO、DO 等,而如果都是手动set、get,一旦属性较多时,操作起来不仅麻烦,而且浪费时间,因此经常会使用一些工具类,进行对象之间的转换,下面将对象与对象之间转换的方式进行对比,一级对象间的使用进行总结。
Bean自动映射工具对比及VO、DTO、PO、DO对象之间的转换
|
6月前
|
设计模式 JSON 前端开发
SSMP整合案例第四步 表现层controller开发及用Result进行统一消息处理
SSMP整合案例第四步 表现层controller开发及用Result进行统一消息处理
60 2
|
7月前
|
前端开发 数据安全/隐私保护
后台组件-DTO
DTO组件是个组件族。
|
网络协议 程序员 网络架构
数据封装与解封装过程
数据封装与解封装过程
265 0
|
7月前
|
JSON 机器人 数据格式
阿里云RPA支持将序列化的JSON数据作为输入参数传递给机器人应用程序
【1月更文挑战第7天】【1月更文挑战第33篇】阿里云RPA支持将序列化的JSON数据作为输入参数传递给机器人应用程序
302 1
|
JSON 前端开发 API
统一处理controller层接口返回的数据
要对controller层的内容进行统一返回,需要用到 @ControllerAdvice ResponseBodyAdvice
436 0
|
JSON 数据格式 Python
django drf 案例--实现url编码和json和dict格式转化小工具(涉及定义模型类,序列化器,类视图,路由),接口测试
django drf 案例--实现url编码和json和dict格式转化小工具(涉及定义模型类,序列化器,类视图,路由),接口测试
|
设计模式 数据处理 Scala
利用Actor实现管道过滤器模式
利用Actor实现管道过滤器模式
利用Actor实现管道过滤器模式
|
JSON 前端开发 中间件