跳到主要内容

管道

管道转换

管道可以做两件事

  1. 转换,可以将前端传入的数据转成成我们需要的数据

  2. 验证 类似于前端的rules 配置验证规则

Nestjs 提供了八个内置转换API

  • ValidationPipe
  • ParseIntPipe
  • ParseFloatPipe
  • ParseBoolPipe
  • ParseArrayPipe
  • ParseUUIDPipe
  • ParseEnumPipe
  • DefaultValuePipe

示例一:

我们接收的动态参数希望是一个number类型现在是string,使用ParseIntPipe转换

image-20221120224246122

示例二:

希望获取到的id是uuid类型

image-20221120224446201

生成uuid来测试

npm install uuid
npm install @types/uuid -D
import * as uuid from 'uuid';
console.log(uuid.v4()); // c308086d-e7c8-41ee-b351-753438ba3a60

image-20221120162318065

管道验证

管道验证DTO(data transform object)

我们首先在user里创建一个验证管道

# 在项目根目录执行创建pipe
nest g pi user

安装验证器:

npm i --save class-validator class-transformer

我们编辑创建用户的dto

create-user.dto.ts
import { IsNotEmpty, IsString, Length } from 'class-validator';
export class CreateUserDto {
@IsNotEmpty()
@IsString()
@Length(4, 10, {
message: 'username的长度不在4-10之间',
})
username: string;
@IsNotEmpty()
@IsString()
code: string;
}

然后我们在controller使用管道和定义类型,导入UserPipe传给修饰符@Body,修改形参body为createUserDto

image-20221120170743698

给user.pipe.ts加点打印,添加用户试试

image-20221120171115256

value就是前端传过来的数据,metaData就是元数据,通过metatype可以去实例化这个类

最后实现验证transform,我们先看看实例化DTO的结果

image-20221120171633548

通过validate验证DTO返回一个promise的错误信息,如果没有错误就是一个空数组,否则有多少验证的错误都会放到数组里面

import {
ArgumentMetadata,
HttpException,
HttpStatus,
Injectable,
PipeTransform,
} from '@nestjs/common';
import { plainToInstance } from 'class-transformer';
import { validate } from 'class-validator';
@Injectable()
export class UserPipe implements PipeTransform {
async transform(value: any, metadata: ArgumentMetadata) {
const DTO = plainToInstance(metadata.metatype, value);
const errors = await validate(DTO);
console.log(errors);
if (errors.length > 0) {
throw new HttpException(
{ name: '', message: errors },
HttpStatus.BAD_REQUEST,
);
}
return value;
}
}

image-20221120225531818

这个时候,我们得到的错误信息是前面封装好的异常拦截器,使用 exception.getResponse()得到校验错误结果,然而我们可以注册全局DTO验证管道,与自己写的效果类似,但是返回的数据格式不同

首先把user.pipe.ts与他的测试文件删掉...,然后修改user.controller.ts,取消使用user.pipe

image-20221120174326184

全局注册

import { ValidationPipe } from '@nestjs/common';
app.useGlobalPipes(new ValidationPipe());

此时得到的数据结构如下

image-20221120225907219