관계설정 레시피와 재료는 OneToMany 관계이다. // recipe.entity.ts @Entity() export class Recipe extends BaseEntity { @IsString() @Column() title: string @OneToMany(() => Ingredient, (ingredient) => ingredient.recipe) ingredients: Ingredient[] } // ingredient.entity.ts @Entity() export class Ingredient { @PrimaryGeneratedColumn() id: number; @IsString() @Column({ length: 10 }) name: string @ManyToOne(() => Recip..
query를 boolean으로 받아오고 싶어 @Type(() => number) 적용해 숫자로 변환하듯이 @Type(() => Boolean)을 적용했더니 늘 true 값을 받아옴 아래와 같이 해결 export const booleanMapper = new Map([ ['undefined', undefined], ['true', true], ['false', false], ]); // test.dto.ts import { IsBoolean } from 'class-validator'; import { Transform } from 'class-transformer'; import { booleanMapper } from 'src/common/dto/boolean-mapper'; export class T..
numberArray를 쿼리로 보낼 때 string으로 보내짐! controller나 service 레이어에서 파싱해도 되지만, 아예 데이터를 받아올 때 변환해서 받아오고 싶어서 아래와 같이 작성함 import { IsNumber } from 'class-validator'; import { Transform } from 'class-transformer'; export class TestDto { @Transform(({ value }) => (JSON.parse(value))) // '[1]' -> [1] 파싱 후 @IsNumber({}, { each: true }) // 검증 numberArray: number[] } 참고 블로그 https://choidr.tistory.com/entry/NestJ..
express의 @Res를 사용하면 Nest.js의 표준 방식이 자동 비활성화된다. 이를 해결하려면 아래 2가지 방법이 있다 내가 직접 res 응답 객체를 컨트롤하여 응답을 보내기 두 방식 다 사용하려면, { passthrough: true } 옵션을 사용하기 공식 문서 https://docs.nestjs.com/controllers#library-specific-approach 참고 블로그 https://greatlaboratory.dev/nestjs/nestjs-02/

다른 모듈을 import 해서 사용을 하게 되는 경우가 많은데, 양쪽에서 서로를 불러올 경우 에러가 발생한다. 에러메시지 A circular dependency between modules ~~~ 원인 // review.module.ts @Module({ imports: [ DatabaseModule, GymModule, // --> Gym 모듈 불러오는 중 ], exports: [ReviewService], controllers: [ReviewController], providers: [ ...ReviewProviders, ReviewService ], }) export class ReviewModule { } // gym.module.ts @Module({ imports: [ DatabaseModul..
회원가입 시 아이디와 비밀번호를 제한하는 등 정규표현식 사용이 필요할 때가 있다. class-validator를 이용해 유효성 검사를 할 때 @Matches 데코레이터를 이용하면 정규표현식을 사용할 수 있다. 예시 @ApiProperty({ description: '영문으로 시작, 숫자+언더바/하이픈 허용, 4~20자' }) @IsString() @Matches(/^[A-Za-z]{1}[A-Za-z0-9_-]{3,19}$/ ) @Column('varchar', { name: 'userName', unique: true, nullable: false, length: 30 }) userName: string; @ApiProperty({ description: '문자, 숫자 1개 이상 포함, 8자 이상' })..
라우터 테스트 하다가 다음과 같은 에러 메시지가 떴다 "ER_BAD_FIELD_ERROR: Unknown column 'NaN' in 'where clause'" 컨트롤러 파일 @Controller('review') // *** 생략 @Get('/my') async myReviews( @Req() request: any ) { console.log("/review/my") // --> 아예 콘솔이 찍히지도 않음 return await this.reviewService.myReviews(request.user.id); } 컨트롤러에서 콘솔을 찍어보니 아예 해당 경로로 진입 자체가 안되는 것으로 보였다. 해결 라우터의 순서가 문제였다. @Get('/my') 위에 @Get('/:id') 가 있었는데, 이 경우..
프로젝트에서 @ApiProperty()와 유효성을 체크하는 데코레이터를 모두 기본적으로 entity에 작성하고 있다. 그런데 Dto를 만드려고 보니 entity와 중복되는 코드들이 많았다. 이 경우 유효성 체크라던가 swagger 에서 수정되어야하는 부분이 있을 때 Dto, Entity 모두를 체크해야하는 문제가 있다. 필요한 것만 뽑아 쓰는 PickType 혹은 옵션으로 만들어주는 PartialType을 사용하려고 했는데, Entity에 없는 값을 쓰려면 어떻게 해야할지 방법을 알 수 없어서 서치해봤다. Entity @Entity() export class Alarm { @PrimaryGeneratedColumn({ type: 'int', name: 'id' }) id: number; @ApiPrope..