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对象之间的转换
|
2月前
|
设计模式 JSON 前端开发
SSMP整合案例第四步 表现层controller开发及用Result进行统一消息处理
SSMP整合案例第四步 表现层controller开发及用Result进行统一消息处理
22 2
|
3月前
|
前端开发 数据安全/隐私保护
后台组件-DTO
DTO组件是个组件族。
|
3月前
|
JSON 数据格式
SpringMVC JSON数据交互 数据不回显问题
SpringMVC JSON数据交互 数据不回显问题
36 1
|
9月前
|
JSON 小程序 JavaScript
小程序模拟调用本地json接口数据
小程序模拟调用本地json接口数据
186 0
|
前端开发 JavaScript Java
SpringBoot 统一功能处理:用户登录权限校验-拦截器、异常处理、数据格式返回
本篇将要学习 Spring Boot 统一功能处理模块,这也是 AOP 的实战环节 用户登录权限的校验实现接口 HandlerInterceptor + WebMvcConfigurer 异常处理使用注解 @RestControllerAdvice + @ExceptionHandler 数据格式返回使用注解 @ControllerAdvice 并且实现接口 @ResponseBodyAdvice
511 0
|
JSON 前端开发 API
统一处理controller层接口返回的数据
要对controller层的内容进行统一返回,需要用到 @ControllerAdvice ResponseBodyAdvice
399 0
【Django学习】(九)自定义校验器_单字段_多字段校验_模型序列化器类
【Django学习】(九)自定义校验器_单字段_多字段校验_模型序列化器类
|
消息中间件 JavaScript 小程序
SpringBoot 统一功能处理:用户登录权限校验-拦截器、异常处理、数据格式返回 下
SpringBoot 统一功能处理:用户登录权限校验-拦截器、异常处理、数据格式返回 下
SpringBoot 统一功能处理:用户登录权限校验-拦截器、异常处理、数据格式返回 下
|
JSON 数据格式 Python
django drf 案例--实现url编码和json和dict格式转化小工具(涉及定义模型类,序列化器,类视图,路由),接口测试
django drf 案例--实现url编码和json和dict格式转化小工具(涉及定义模型类,序列化器,类视图,路由),接口测试