pipe
管道用于对 Controller
路由处理程序正在处理的 arguments
进行操作。
管道有两种典型的用例:
- 转换:将输入数据转换为所需形式(例如,从字符串转换为整数)
- 验证:评估输入数据,如果有效,则直接传递,否则抛出异常
1.Built-in pipes
Nest
提供了一组内置管道,它们用于验证和转换数据。
- ValidationPipe
- DefaultValuePipe
ParseIntPipe
ParseFloatPipe
ParseBoolPipe
ParseArrayPipe
ParseUUIDPipe
ParseEnumPipe
ParseFilePipe
ParseDatePipe
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
接口约定。该方法有两个参数:
value
: 管道处理程序正在处理的参数值metadata
: 有关参数的元数据
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();