JS后端框架 Nest.js入门篇 数据校验、数据转换、管道aop、Pipe(七)

注:此文仅记录博主初次学习nestjs之后的认识和理解,经验尚浅,文章内容仅供参考,如若有误,敬请指正。

一:作为切面

此文暂不对细节展开探讨

1.切面类型:PipeTransform接口实现类

2.切面输入

value:流入管道的值
ArgumentMetadata:该value的元数据信息
export interface ArgumentMetadata {
    
    
  type: 'body' | 'query' | 'param' | 'custom';
  metatype?: Type<unknown>;
  data?: string;
}

3.切面输出:管道流出的值 or 抛出异常返回响应

4.切面使用场景

  • 数据校验
  • 数据转换

二:数据校验案例(类验证器方式)

输入数据通过验证管道验证,成功返回原数据,失败则请求结束返回数据校验异常响应。

1.自动校验工具(声明式校验)

  • 安装工具
npm i --save class-validator class-transformer
  • 验证管道(通常内置管道ValidationPipe即可满足需求,当然也可使用自定义管道)

2.校验规则声明

class-validator 文档查看所有类型约束

import {
    
     IsString, IsInt } from 'class-validator';
// CreateCatDto 实例的校验规则
export class CreateCatDto {
    
    
  @IsString()
  name: string;

  @IsInt()
  age: number;

  @IsString()
  breed: string;
}

3.数据绑定校验管道

  • 参数级别绑定
@Post()
async create(@Body(new ValidationPipe()) createCatDto: CreateCatDto类中) {
    
    // 使用内置验证管道ValidationPipe验证数据createCatDto,规则定义在createCatDto对象的类定义中
  this.catsService.create(createCatDto);
}
  • 方法级别绑定
@Post()
@UsePipes(ValidationPipe)// provider依赖注入
async create(@Body() createCatDto: CreateCatDto) {
    
    
  this.catsService.create(createCatDto);
}
  • 全局级别绑定(main.ts)
async function bootstrap() {
    
    
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(3000);
}
bootstrap();

三:数据转换案例

1.管道函数

  • 使用内置转换管道
  • 自定义转换管道
import {
    
     PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
// 此管道ParseIntPipe已经内置
@Injectable()
export class ParseIntPipe implements PipeTransform<string, number> {
    
    
  transform(value: string, metadata: ArgumentMetadata): number {
    
    
    const val = parseInt(value, 10);
    if (isNaN(val)) {
    
    
      throw new BadRequestException('Validation failed');
    }
    return val;
  }
}

2.数据绑定转换管道

@Get(':id')
async findOne(@Param('id', new ParseIntPipe()) id) {
    
    
  return await this.catsService.findOne(id);
}

猜你喜欢

转载自blog.csdn.net/jw2268136570/article/details/107841755