管道
管道转换
管道可以做两件事
-
转换,可以将前端传入的数据转成成我们需要的数据
-
验证 类似于前端的rules 配置验证规则
Nestjs 提供了八个内置转换API
- ValidationPipe
- ParseIntPipe
- ParseFloatPipe
- ParseBoolPipe
- ParseArrayPipe
- ParseUUIDPipe
- ParseEnumPipe
- DefaultValuePipe
示例一:
我们接收的动态参数希望是一个number类型现在是string,使用ParseIntPipe
转换
示例二:
希望获取到的id是uuid类型
生成uuid来测试
npm install uuid
npm install @types/uuid -D
import * as uuid from 'uuid';
console.log(uuid.v4()); // c308086d-e7c8-41ee-b351-753438ba3a60
管道验证
管道验证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
给user.pipe.ts加点打印,添加用户试试
value就是前端传过来的数据,metaData就是元数据,通过metatype可以去实例化这个类
最后实现验证transform,我们先看看实例化DTO的结果
通过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;
}
}
这个时候,我们得到的错误信息是前面封装好的异常拦截器,使用 exception.getResponse()
得到校验错误结果,然而我们可以注册全局DTO验证管道,与自己写的效果类似,但是返回的数据格式不同
首先把user.pipe.ts与他的测试文件删掉...,然后修改user.controller.ts,取消使用user.pipe
全局注册
import { ValidationPipe } from '@nestjs/common';
app.useGlobalPipes(new ValidationPipe());
此时得到的数据结构如下