Skip to content

pipe 管道用于对 Controller 路由处理程序正在处理的 arguments 进行操作。

管道有两种典型的用例:

  1. 转换:将输入数据转换为所需形式(例如,从字符串转换为整数)
  2. 验证:评估输入数据,如果有效,则直接传递,否则抛出异常

1.Built-in pipes

Nest 提供了一组内置管道,它们用于验证和转换数据

Built-in pipes

2.Parse* Pipe

譬如一个解析整数参数的例子:

ts
// 可以直接使用ParseIntPipe类
@Get()
async findOne(@Query('id', ParseIntPipe) id: number) {
  return this.catsService.findOne(id);
}
ts
// 也可以使用new ParseIntPipe()创建实例以精细化控制
@Get(':id')
async findOne(
  @Param('id', new ParseIntPipe({ errorHttpStatusCode: HttpStatus.NOT_ACCEPTABLE }))
  id: number,
) {
  return this.catsService.findOne(id);
}

3.Validation pipe

验证类型的管道,通常可用于 DTO 对象的格式验证。

ts
// create-cat.dto.ts
export class CreateCatDto {
  name: string;
  age: number;
  breed: string;
}

// cats.controller.ts
@Post()
async create(@Body() createCatDto: CreateCatDto) {
  this.catsService.create(createCatDto);
}

它分为两种实现方式:Object schema validator或者Class Validator

推荐使用后者,它结合的很好。

4.Custom pipes

自定义管道

ts
import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common';

@Injectable()
export class ValidationPipe implements PipeTransform {
  transform(value: any, metadata: ArgumentMetadata) {
    return value;
  }
}

每个管道都必须实现 transform() 方法,以履行 PipeTransform 接口约定。该方法有两个参数:

5.Global scoped pipes

ts
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(process.env.PORT ?? 3000);
}
bootstrap();