pipe 는 타입 변환(trasform)과 유효성 검사(validataion) 2가지를 수행한다.
controller 의 route handler 에서 동작한다.
@Get(':id')
async findOne(@Param('id', ParseIntPipe) id: number) {
return this.catsService.findOne(id);
}
@Get(':uuid')
async findOne(@Param('uuid', new ParseUUIDPipe()) uuid: string) {
return this.catsService.findOne(uuid);
}
ValidationPipe
ParseIntPipe
ParseFloatPipe
ParseBoolPipe
ParseArrayPipe
ParseUUIDPipe
ParseEnumPipe
DefaultValuePipe
ParseFilePipe
PipeTransform<T,R>
인터페이스를 구현하여 파이프 정의T
는 input, R
은 return 타입import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common';
@Injectable()
export class PositiveIntPipe implements PipeTransform {
transform(value: any, metadata: ArgumentMetadata) {
if (value < 0) {
throw new Exception('value < 0', 400)
}
return value;
}
}
class-validator
, class-transformer
설치한다.npm i --save class-validator class-transformer
ValidataionPipe
를 바인딩하여 전체 엔드포인트 보호async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
await app.listen(3000);
}
bootstrap();
@Post()
@UsePipes(new ValidationPipe({ transform: true }))
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
class-validator
에 정의된 데코레이터를 통해 검사import { IsEmail, IsNotEmpty, IsNumberString } from 'class-validator';
export class CreateUserDto {
@IsEmail()
email: string;
@IsNotEmpty()
password: string;
@IsNumberString()
age: number;
}
whitelist: true
로 하면 정의되지 않은 것들은 제거 후 받음forbidNonWhitelisted
을 true 로 설정시 정의되지 않은 내용이 있으면 exception 발생app.useGlobalPipes(
new ValidationPipe({
whitelist: true,
}),
);