Nest核心组件 - 管道 Pipes

7/8/2023 NodejsNestjs

# 2.6 管道(Pipes)

管道在 NestJS 中用于处理输入数据的验证和转换。它允许我们在数据传递到控制器或服务之前对其进行预处理。

# 2.6.1 创建一个管道

让我们来创建一个简单的管道。在 src 目录下创建一个新的文件 validation.pipe.ts,并编写以下代码:

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

@Injectable()
export class ValidationPipe implements PipeTransform<any> {
  transform(value: any, metadata: ArgumentMetadata) {
    if (!value) {
      throw new BadRequestException('Validation failed: No data submitted');
    }
    return value;
  }
}
1
2
3
4
5
6
7
8
9
10
11

在上面的代码中,我们创建了一个实现了 PipeTransform 接口的管道类 ValidationPipe。PipeTransform 接口要求管道类实现 transform 方法,该方法将在数据传递到控制器或服务之前被调用。

在 transform 方法中,我们可以对传入的数据 value 进行验证和转换。在这个例子中,我们简单地检查 value 是否为空,如果为空,则抛出 BadRequestException 异常,表示数据验证失败。

# 2.6.2 使用管道

现在我们已经创建了一个简单的管道 ValidationPipe,接下来我们需要在控制器或服务中使用它。

要使用管道,我们可以通过 @UsePipes() 装饰器将其应用于控制器中的特定路由或全局路由。在这里我们将它应用于一个特定的控制器路由示例。

打开 cats.controller.ts 文件,并将 ValidationPipe 应用于 create 方法:

import { Controller, Get, Post, Body, UsePipes } from '@nestjs/common';
import { CatsService } from './cats.service';
import { CreateCatDto } from './dto/create-cat.dto';
import { ValidationPipe } from '../validation.pipe';

@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @Post()
  @UsePipes(ValidationPipe)
  create(@Body() createCatDto: CreateCatDto) {
    this.catsService.create(createCatDto.name);
  }

  @Get()
  findAll(): string[] {
    return this.catsService.findAll();
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

在上面的代码中,我们在 create 方法上使用了 @UsePipes(ValidationPipe) 装饰器,将 ValidationPipe 应用于 create 方法。这样,当请求到达 create 方法时,会首先调用 ValidationPipe 进行数据验证。

当我们发送 POST 请求到 /cats 路径时,create 方法会被调用,而在调用之前,ValidationPipe 会先验证请求体中的数据是否符合要求,如果验证失败,则抛出 BadRequestException 异常。

编辑时间: 7/8/2023, 10:00:00 AM