管道(参数校验)
2025/12/17大约 2 分钟
管道(参数校验)
管道主要有两种用法
- 转换: 将输入数据转化为所需的形式
- 验证: 评估输入数据是否符合特定的规则
内置管道
- ValidationPipe
- ParseIntPipe
- ParseFloatPipe
- ParseBoolPipe
- ParseArrayPipe
- ParseUUIDPipe
- ParseEnumPipe
- DefaultValuePipe
- ParseFilePipe
- ParseDatePipe
绑定管道
方法级别的管道
管道方法会在方法调用前执行
@Get(':id')
async findOne(@Param('id', ParseIntPipe) id: number) {
return this.catsService.findOne(id);
}自定义管道
我们从简单的 ValidationPipe 开始。最初,我们让它简单地接收一个输入值并立即返回相同的值,表现得像一个恒等函数。
import {PipeTransform, Injectable, ArgumentMetadata} from '@nestjs/common';
@Injectable()
export class ValidationPipe implements PipeTransform {
transform(value: any, metadata: ArgumentMetadata) {
return value;
}
}注意
PipeTransform<T, R> 是一个必须由所有管道实现的泛型接口。该泛型接口使用 T 表示输入 value 的类型,R 表示 transform() 方法的返回类型。
使用类验证器
::: waring 警告
本节中的技术需要使用 TypeScript,如果你的应用使用原生 JavaScript 编写则无法使用。
:::
类验证方式
npm add -S class-validator class-transformerexport class SignUpDTO {
@ApiProperty({
description: '手机号',
type: 'number',
required: true,
default: 17826737860,
})
@IsPhoneNumber('CN', {message: '请输入正确的手机号'})
readonly phone: string
@ApiProperty({
description: '用户名',
type: 'string',
required: true,
default: '沈鑫杰',
})
readonly name: string
@ApiProperty({
description: '性别',
type: 'string',
required: false,
default: '男',
})
readonly gender: string
@ApiProperty({
description: '年龄',
type: 'number',
required: false,
default: 18,
})
@ValidateIf((o: SignUpDTO) => !isEmpty(o.age))
@IsInt({message: '请输入正确的年龄'})
readonly age: number
@ApiProperty({
description: '个人简介',
type: 'string',
required: false,
default: '这个人很懒,什么都没有留下。',
})
readonly description: string
@ApiProperty({
description: '密码',
type: 'string',
required: true,
default: 'Aa123456',
})
@IsNotEmpty({message: '密码不可为空'})
readonly password: string
} @ApiResponseDTO(SignUpResDto)
@ApiOperation({
summary: '注册',
})
@Public()
@Post('sign-up')
@HttpCode(HttpStatus.OK)
signUp(@Body() signUpDto: SignUpDTO) {
return this.authService.signUp(signUpDto)
}全局管道
这样使用的前提是我们需要在全局加上验证管道
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
await app.listen(process.env.PORT ?? 3000);
}
bootstrap();模块管道
import { Module } from '@nestjs/common';
import { APP_PIPE } from '@nestjs/core';
@Module({
providers: [
{
provide: APP_PIPE,
useClass: ValidationPipe,
},
],
})
export class AppModule {}