JS/Nest.js

[Nest JS] id 중복검사 구현

Mini_96 2024. 8. 18. 13:33

* 엔티티에서 @Unique 딸깍

import { BaseEntity, Column, Entity, PrimaryGeneratedColumn, Unique } from "typeorm";

@Entity()
@Unique(['username'])
export class User extends BaseEntity{
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  username: string;

  @Column()
  password: string;
}

문제 : 무조건 500에러만 던져버림

 

* 원인 : 에러가 그냥 컨트롤러 레벨로 가서 500에러를 던져버림

해결 : 에러를 try catch로 잡아줘야함

리포지토리에서 save를 try-catch 안에 넣어주면됨.

@Injectable()
export class UserRepository extends Repository<User>{
  constructor(dataSource: DataSource) {
    super(User, dataSource.createEntityManager());
  }

  async createUser(authCredentialsDto : AuthCredentialsDto){
    const {username, password} = authCredentialsDto;
    const user = this.create({username,password}); //리포지토리.create => db저장용객체로 만들어줌

    try {
      await this.save(user);
    } catch (error){
      console.log(error);
    }
  }
}

에러 메시지 찍어보기

에러코드 23505 == already key error 코드임 -> 메시지 찍어주면 되겠다.

  async createUser(authCredentialsDto : AuthCredentialsDto){
    const {username, password} = authCredentialsDto;
    const user = this.create({username,password}); //리포지토리.create => db저장용객체로 만들어줌

    try {
      await this.save(user);
    } catch (error){
      if(error.code==='23505'){
        throw new ConflictException('Existing username');
      }
      else{
        throw new InternalServerErrorException();
      }
    }
  }
}

결과