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();

目录
相关文章
|
移动开发 Android开发 HTML5
uniapp视频播放功能
uniapp视频播放功能
1623 0
|
移动开发 自然语言处理 小程序
分享88个企业政府PHP源码,总有一款适合你
分享88个企业政府PHP源码,总有一款适合你
454 2
|
自然语言处理 运维 小程序
分享99个PHP源码,总有一款适合您
分享99个PHP源码,总有一款适合您
259 1
|
JavaScript 定位技术 API
百度离线地图API v3.0开发解决方案
百度离线地图API v3.0开发解决方案
1019 0
|
移动开发 JavaScript 小程序
uView Tabs 标签
uView Tabs 标签
399 0
|
小程序
微信小程序:本地开发环境和线上环境配置
微信小程序:本地开发环境和线上环境配置
1077 0
|
域名解析 网络协议 应用服务中间件
Docker搭建Nginx并配置ssl证书
Docker搭建Nginx并配置ssl证书
2702 1
Docker搭建Nginx并配置ssl证书
|
弹性计算 网络协议 存储
10分钟幻兽帕鲁服务器搭建保姆级教程
幻兽帕鲁最近非常火。有些小伙伴可能不喜欢跟陌生人一起玩,那么你可以搭建一个专有服务器和朋友一起联机游戏。自己搭建服务器不仅更私密,还能自定义游戏里的一些选项,比如调整工作速度倍率、经验获取倍率等。 这篇教程将引导你在10分钟左右快速完成幻兽帕鲁服务器的搭建。
4158 5
|
开发框架 JavaScript Android开发
uniapp页面跳转【回退】
uniapp页面跳转【回退】
1511 4
|
弹性计算 搜索推荐
幻兽帕鲁palworld专用服务器价格多少钱?2024年阿里云幻兽帕鲁服务器1个月26元起
在探讨《幻兽帕鲁》游戏服务器价格前,我们先来简单了解这款近期爆火的游戏。《幻兽帕鲁》是一款由Pocketpair匠心打造的开放世界生存游戏,其独树一帜的题材与画风在全球范围内吸引了众多忠实玩家。随着游戏热度的不断攀升,越来越多的玩家开始追求更加个性化的游戏体验,搭建专属游戏服务器成为他们的首选。