[nestjs] must be a number conforming to the specified constraints

yy·2024년 5월 1일

menu 등록 시 클라이언트에게 name을 받고, 서버에서 자동으로 order 값을 증가시켜 db에 저장하는 api를 만들고 있었다.

근데 자꾸 order를 숫자로 적어야한다고 뜬다.

  1. dto에서 order를 number로 해놓은 상태
  2. service에서 order값 number로 명시해줌.
//create-menu.dto.ts
import { Type } from 'class-transformer';
import { IsNotEmpty, IsNumber, IsString } from 'class-validator';

export class CreateCategoryDto {
  @IsString()
  @IsNotEmpty({ message: 'name을 입력해주세요.' })
  name: string;

  @Type(() => Number)
  @IsNumber()
  readonly order: number;  
}
//menu.servcie.ts
  /* 카테고리 등록 */
  async createCategory(req: Request, name: string) {
    if (req['user'].userType !== UserType.OWNER) {
      throw new UnauthorizedException(`사장님만 사용할 수 있는 API입니다.`);
    }

    const findCategoryByName = await this.categoryRepository.findOne({
      where: { name },
    });

    if (findCategoryByName) {
      throw new ConflictException(`${name} 카테고리가 이미 있습니다.`);
    }

    const category = new Category();
    category.name = name;

    const foundCategory = await this.categoryRepository.findOne({
      where: { deletedAt: null },
      order: { order: 'DESC' },
    });

    if (!foundCategory) {
      category.order = 1;
    } else {
      category.order = foundCategory.order + 1;
    }

    await this.categoryRepository.save(category);

    return { message: '카테고리를 등록하였습니다.' };
  }

자료형을 명시적으로 Number()를 씌어봐도 같은 문제가 반복되었다. 그러다가 깨달은 사실...
클라이언트한테서 입력받지 않으니 dto에다가 명시안해줘도 되는거잖아?
헐랑방구

create-menu.dto.ts에서 order를 지우니 해결.
create-menu.dto.ts를 상속받는 update-menu.dto.ts는 조금 손봐주고 완료했다.

//update-menu.dto.ts
import { PartialType } from '@nestjs/mapped-types';
import { CreateCategoryDto } from './create-category.dto';
import { IsNumber } from 'class-validator';

export class UpdateCategoryDto extends PartialType(CreateCategoryDto) {
  @IsNumber()
  order: number;
}
profile
시간이 걸릴 뿐 내가 못할 건 없다.

0개의 댓글