NestJS之11- 管道Pipe

511 阅读2分钟

1. 什么是管道

NestJS管道是用于验证和转换传入数据的一种机制。管道能够处理两个函数之间的数据,例如控制器中的输入和处理函数之间。 通过将它们连接起来,我们可以构建出各种复杂的组合来验证和转换输入和请求数据。

管道基于一个函数式编程的想法,它们定义了一系列转换和验证操作,也就是管道运算符。这些运算符的输入和输出是可联系的,这意味着它们可以像管道一样组合在一起,并且可以在多个管道之间继续传递数据。

在NestJS中,管道可以用于以下方面:

  • 数据验证:通过验证输入数据的类型,长度和格式来确保数据的有效性。
  • 数据转换:将输入数据转换成特定的格式或类型,以便正确处理数据。
  • 数据清理:从数据中删除任何无效的内容或过滤掉不需要的数据。

为了使用管道,你需要完成以下步骤:

1.创建管道类并实现PipeTransform接口。

2.在处理函数上挂载管道。

这样就可以在处理函数中使用管道。

NestJS提供了一系列内置的管道,例如ValidationPipe和ParseIntPipe等。您可以使用这些管道或编写自己的管道来处理数据。

2. NestJS中常见的管道

在NestJS中,内置了多种可以使用的管道(Pipe),主要作用是用于预处理控制器中的输入数据和输出。下面是NestJS内置的一些常见的管道:

  1. ValidationPipe:用于验证控制器中的输入数据是否符合预期的格式和规则。默认情况下,ValidationPipe使用class-validator库进行验证。
  2. ParseIntPipe:用于将URL参数中的字符串转换成整数类型。如果无法转换,将抛出BadRequestException异常。
  3. ParseBoolPipe:用于将URL参数中的字符串转换成布尔类型。如果无法转换,将抛出BadRequestException异常。
  4. BodyParserPipe:用于解析POST、PUT、PATCH、DELETE等请求的请求体,并将结果存储在请求对象的body属性中。
  5. DefaultValuePipe:用于在当前请求对象中查找指定的参数,如果找不到则使用默认值。
  6. TransformPipe:用于对控制器中传入的简单类型(例如字符串、数字)进行值转换和格式化。
  7. 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参数。

image.png

uuid 验证

  @Get('/pipe')
  find(@Query('page', ParseUUIDPipe) page: number) {
    console.log(typeof page);
    return `传入  ${page}  类型为${typeof page}`;
  }

image.png