[Dimelo Project] 회원가입 구현

Suyeon Pi·2022년 1월 8일
0

Dimelo

목록 보기
4/22
post-custom-banner

작업내용

  • create-user.dto
    create user dto를 만들어서 받을 데이터 타입을 정해주었다. dto에서는 class-validor를 이용해 데이터가 email인지, string인지 자동으로 검증해 줄 수 있다.

  • 아이디와 닉네임이 이미 존재 할 경우 UnauthorizedExeption 에러를 throw하도록 하였다.

  • 던져진 에러는 어플 전체에 global로 exeption filter를 이용해 적절한 에러 메세지를 리턴하도록 하였다.

signup 함수 코드

// users.controller.ts
@Controller('api/users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @ApiOperation({ summary: '회원 가입' })
  @Post('/signup')
  async signup(@Body() data: CreateUserDto) {
    await this.usersService.createUser(
      data.email,
      data.nickname,
      data.password,
    );
  }
  ...
// users.service.ts
@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(Users)
    private usersRepository: Repository<Users>,
  ) {}

  async createUser(email: string, nickname: string, password: string) {
    const foundEmail = await this.usersRepository.findOne({ where: { email } });
    if (foundEmail) {
      throw new UnauthorizedException('이미 해당하는 아이디가 존재합니다');
    }
    const foundNick = await this.usersRepository.findOne({
      where: { nickname },
    });
    if (foundNick) {
      throw new UnauthorizedException('이미 해당하는 닉네임이 존재합니다');
    }
    const hashedPassword = await bcrypt.hash(
      password,
      parseInt(process.env.BCRYPT_SALT_ROUNDS),
    );

    await this.usersRepository.save({
      email,
      nickname,
      password: hashedPassword,
    });
  }
}
// usrs.module.ts
@Module({
  imports: [TypeOrmModule.forFeature([Users])],
  controllers: [UsersController],
  providers: [UsersService],
})
export class UsersModule {}
profile
Stay hungry, Stay foolish!
post-custom-banner

0개의 댓글