# 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;
}
}
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();
}
}
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 异常。