注:此文仅记录博主初次学习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.校验规则声明
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);
}