全书目录

第七篇:NestJS 完全指南 —— 国际机场总调度宇宙

第九章:Pipe —— 它不只是校验器,它是入口整形机

1 分钟 157 字 第 189 / 962 个阅读单元

很多人把 Pipe 理解得太窄,只记得 ValidationPipe
其实 Pipe 是“请求参数进入 handler 之前的处理挂点”。

内置例子:

ts
@Get(':id')
findOne(@Param('id', ParseIntPipe) id: number) {
  return this.flightsService.findOne(id);
}

这就意味着:

  • 路径参数先过 ParseIntPipe
  • 不能转成数字就直接报错
  • Controller 根本拿不到非法值

你也可以自定义 Pipe:

ts
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();
  }
}

使用:

ts
@Get()
search(@Query('keyword', TrimStringPipe) keyword: string) {
  return this.flightsService.search(keyword);
}

类比:

text
乘客材料进入柜台前
先走预处理通道
├── 转类型
├── 裁剪格式
├── 校验合法性
└── 不合法直接拦下