create-user.dto.ts
export class JoinRequestDto {
readonly email: string;
readonly nickname: string;
readonly password: string;
}
user.controller.ts
@Controller('user')
export class UserController {
constructor(private readonly userService: UserService) {}
...
@Post()
create(@Body() joinRequestDto: JoinRequestDto) {
return this.userService.create(joinRequestDto);
}
}
🙅♀️정의한 type에 맞지 않거나, 필요한데 request에 없을 때 하나 하나 에러 처리를 해줄 수도 있지만
if (!email) {
throw new BadRequestException('이메일이 없네요');
}
if (!nickname) {
throw new BadRequestException('닉네임이 없네요');
}
if (!password) {
throw new BadRequestException('비밀번호이 없네요');
}
🙆♀️자동으로 검증하는 기능을 Nest에서 제공하고 있다.
import { IsNotEmpty } from 'class-validator';
export class JoinRequestDto {
@IsNotEmpty()
email: string;
@IsNotEmpty()
nickname: string;
@IsNotEmpty()
password: string;
}
response
를 보면 자동으로 클라이언트에 에러 메시지를 보내주고 있다.
{
"statusCode": 400,
"error": "Bad Request",
"message": ["email should not be empty",
"nickname should not be empty",
"password should not be empty"
]
}
🙆♀️ 검증과 함께 array로 변환하여 사용할 수 있다.
@Get()
findByIds(
@Query('ids', new ParseArrayPipe({ items: Number, separator: ',' }))
ids: number[],
) {
return 'This action returns users by ids';
}
너무 유용하잖아? 그럼 자세히 공부해보자😀
ValidationPipe
ParseIntPipe
ParseBoolPipe
ParseArrayPipe
ParseUUIDPipe
$ npm i --save class-validator class-transformer
export interface ValidationPipeOptions extends ValidatorOptions {
transform?: boolean;
// true로 설정하면 유효성 검사 오류가 클라이언트에 반환되지 않습니다.
disableErrorMessages?: boolean;
// 유효성 검사 오류의 배열을 가져오고 throw할 예외 개체를 반환합니다.
exceptionFactory?: (errors: ValidationError[]) => any;
}
📢 이 외에도 다양한 옵션들이 있다.
ValidationPipe
을 바인딩하여, 모든 엔드포인트에 적용한다.main.ts
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
await app.listen(3000);
}
bootstrap();
import { IsEmail, IsNotEmpty } from 'class-validator';
export class JoinRequestDto {
@IsNotEmpty()
@IsEmail()
email: string;
@IsNotEmpty()
nickname: string;
@IsNotEmpty()
password: string;
}
400 Bad Request
코드로 자동 응답한다.{
"statusCode": 400,
"error": "Bad Request",
"message": ["email must be an email"]
}
📢 이 외에도 다양한 유효성 검사 규칙들이 있다.
import { IsNumberString } from 'class-validator';
export class FindOneParams {
@IsNumberString()
id: number;
}
@Get(':id')
findOne(@Param() params: FindOneParams) {
return 'This action returns a user';
}
@Post()
@UsePipes(new ValidationPipe({ transform: true }))
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
string
으로 제공되지만, number
로 지정해놓으면 ValidationPipe
가 자동 변환해준다.app.useGlobalPipes(
new ValidationPipe({
transform: true,
}),
);
@Get(':id')
findOne(
@Param('id', ParseIntPipe) id: number,
@Query('sort', ParseBoolPipe) sort: boolean,
) {
console.log(typeof id === 'number'); // true
console.log(typeof sort === 'boolean'); // true
return 'This action returns a user';
}
@Get()
findByIds(
@Query('ids', new ParseArrayPipe({ items: Number, separator: ',' }))
ids: number[],
) {
return 'This action returns users by ids';
}
GET /?ids=1,2,3