很多人把 Pipe 理解得太窄,只记得 ValidationPipe。
其实 Pipe 是“请求参数进入 handler 之前的处理挂点”。
内置例子:
@Get(':id')
findOne(@Param('id', ParseIntPipe) id: number) {
return this.flightsService.findOne(id);
}这就意味着:
- 路径参数先过
ParseIntPipe - 不能转成数字就直接报错
- Controller 根本拿不到非法值
你也可以自定义 Pipe:
import { BadRequestException, Injectable, PipeTransform } from '@nestjs/common';
@Injectable()
export class TrimStringPipe implements PipeTransform {
transform(value: unknown) {
if (typeof value !== 'string') {
throw new BadRequestException('必须是字符串');
}
return value.trim();
}
}使用:
@Get()
search(@Query('keyword', TrimStringPipe) keyword: string) {
return this.flightsService.search(keyword);
}类比:
乘客材料进入柜台前
先走预处理通道
├── 转类型
├── 裁剪格式
├── 校验合法性
└── 不合法直接拦下