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视频播放功能
1775 0
|
移动开发 自然语言处理 小程序
分享88个企业政府PHP源码,总有一款适合你
分享88个企业政府PHP源码,总有一款适合你
492 2
|
自然语言处理 运维 小程序
分享99个PHP源码,总有一款适合您
分享99个PHP源码,总有一款适合您
296 1
|
移动开发 JavaScript 小程序
uView Tabs 标签
uView Tabs 标签
439 0
|
小程序
微信小程序:本地开发环境和线上环境配置
微信小程序:本地开发环境和线上环境配置
1163 0
|
弹性计算 网络协议 存储
10分钟幻兽帕鲁服务器搭建保姆级教程
幻兽帕鲁最近非常火。有些小伙伴可能不喜欢跟陌生人一起玩,那么你可以搭建一个专有服务器和朋友一起联机游戏。自己搭建服务器不仅更私密,还能自定义游戏里的一些选项,比如调整工作速度倍率、经验获取倍率等。 这篇教程将引导你在10分钟左右快速完成幻兽帕鲁服务器的搭建。
4249 5
|
10月前
|
存储 人工智能 缓存
AI变革药物研发:深势科技的云原生实践之路
近日,阿里云助力深势科技推出创新的玻尔Bohrium®科研云平台和Hermite®药物计算设计平台,并持续完善。
AI变革药物研发:深势科技的云原生实践之路
|
11月前
|
机器学习/深度学习 人工智能 程序员
阿里云出手DeepSeek拒绝服务器繁忙,程序员直呼:真香!
阿里云PAI平台支持一键部署DeepSeek-V3和DeepSeek-R1大模型,用户无需编写代码即可完成从训练到部署的全过程。通过PAI Model Gallery,开发者可轻松选择并部署所需模型版本,享受高效、便捷的AI开发体验。教程详细介绍了开通PAI、选择模型及一键部署的具体步骤,帮助用户快速上手。
|
人工智能 搜索推荐 物联网
3D大模型助力,15分钟即可训练高质量、个性化的数字人模型,代码已开放
《MimicTalk: 快速生成个性化3D数字人》介绍了一种创新方法,利用3D大模型在15分钟内训练出高质量、个性化的数字人模型。该方法基于NeRF技术,通过“静态-动态混合适应”实现高效训练,显著提升了数字人在视频会议、虚拟现实等领域的应用潜力。论文链接:https://arxiv.org/pdf/2410.06734
388 4
|
开发框架 运维 应用服务中间件
阿里云轻量应用服务器82元和298元与云服务器99元和199元区别及选择参考
目前阿里云推出了几款价格比较实惠的轻量应用服务器和云服务器,轻量应用服务器有2核2G3M 50GB高效云盘,价格为82元1年;2核4G4M 60GB高效云盘,价格为298元1年;经济型e实例2核2G,40G ESSD Entry盘,3M带宽,价格为99元1年;通用算力型u1实例2核4G,80G ESSD Entry盘,5M带宽,价格为199元1年。本文将对这几款轻量应用服务器和云服务器进行对比和测评,分析其性能和适用场景,以供大家选择参考。
阿里云轻量应用服务器82元和298元与云服务器99元和199元区别及选择参考