1. 什么是管道
NestJS管道是用于验证和转换传入数据的一种机制。管道能够处理两个函数之间的数据,例如控制器中的输入和处理函数之间。 通过将它们连接起来,我们可以构建出各种复杂的组合来验证和转换输入和请求数据。
管道基于一个函数式编程的想法,它们定义了一系列转换和验证操作,也就是管道运算符。这些运算符的输入和输出是可联系的,这意味着它们可以像管道一样组合在一起,并且可以在多个管道之间继续传递数据。
在NestJS中,管道可以用于以下方面:
- 数据验证:通过验证输入数据的类型,长度和格式来确保数据的有效性。
- 数据转换:将输入数据转换成特定的格式或类型,以便正确处理数据。
- 数据清理:从数据中删除任何无效的内容或过滤掉不需要的数据。
为了使用管道,你需要完成以下步骤:
1.创建管道类并实现PipeTransform接口。
2.在处理函数上挂载管道。
这样就可以在处理函数中使用管道。
NestJS提供了一系列内置的管道,例如ValidationPipe和ParseIntPipe等。您可以使用这些管道或编写自己的管道来处理数据。
2. NestJS中常见的管道
在NestJS中,内置了多种可以使用的管道(Pipe),主要作用是用于预处理控制器中的输入数据和输出。下面是NestJS内置的一些常见的管道:
- ValidationPipe:用于验证控制器中的输入数据是否符合预期的格式和规则。默认情况下,ValidationPipe使用class-validator库进行验证。
- ParseIntPipe:用于将URL参数中的字符串转换成整数类型。如果无法转换,将抛出BadRequestException异常。
- ParseBoolPipe:用于将URL参数中的字符串转换成布尔类型。如果无法转换,将抛出BadRequestException异常。
- BodyParserPipe:用于解析POST、PUT、PATCH、DELETE等请求的请求体,并将结果存储在请求对象的body属性中。
- DefaultValuePipe:用于在当前请求对象中查找指定的参数,如果找不到则使用默认值。
- TransformPipe:用于对控制器中传入的简单类型(例如字符串、数字)进行值转换和格式化。
- ParseUUIDPipe:用于将URL参数中的字符串转换成UUID类型(即Universally Unique Identifier)。如果无法转换,将抛出BadRequestException异常。
3. 使用管道
app.controller.ts
import {
Controller,
Query,
Get,
ParseIntPipe,
} from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor() {}
@Get('/pipe')
find(@Query('page', ParseIntPipe) page: number) {
console.log(typeof page);
return `this is ${page}`;
}
}
使用了ParseIntPipe来解析page参数。因此,当我们调用GET /pipe?page=2时,page参数将被转换成数字类型并传递给方法中的page参数。
uuid 验证
@Get('/pipe')
find(@Query('page', ParseUUIDPipe) page: number) {
console.log(typeof page);
return `传入 ${page} 类型为${typeof page}`;
}