TIL

24.02.08

아리단길아조씨 2024. 2. 13. 13:53
728x90

뉴스피드 프로젝트가 시작이 되었는데 나는 아직 실력이 많이 부족해서 회원가입, 로그인, 로그아웃, 프로필조회, 프로필 수정API를 구현하기로 했고 부족하기 때문에 팀장님의 도움을 받아 작성한 코드를 하나씩 읽고, 주석을 달아보면서 공부를 진행했다.

// 회원가입 API
router.post('/sign-up', async (req, res, next) => {
  try {
    // 클라이언트로 부터 전달받은 body 값을 객체분해할당한다.
    const {
      email,
      password,
      passwordchek,
      name,
      age,
      gender,
      interest,
      selfInfo,
    } = req.body;

    // 검증 부분
    // 비밀번호의 길이가 6자 이상이 아닐 경우에 상태코드 400과 오류메시지를 전달한다.
    if (!(password.length >= 6))
      return res
        .status(400)
        .json({ message: '비밀번호는 6자리 이상을 입력해주세요' });

    // 입력한 비밀번호와 재확인용 비밀번호가 다를 경우 상태코드 400과 오류메시지를 전달한다.
    if (password !== passwordchek)
      return res.status(400).json({ message: '비밀번호가 일치하지 않습니다' });

    // users 테이블에서 email이라는 조건으로 데이터를 하나 찾아서 user에 할당한다.
    const user = await prisma.users.findFirst({
      where: { email },
    });

    // user라는 값이 있으면 상태코드 409와 오류메시지를 전달한다.
    if (user)
      return res.status(409).json({ message: '이미 가입된 이메일입니다.' });

    // hashpassword 상수에 bcrypt 라이브러리를 사용하여 비밀번호를 해쉬화 한다.(해쉬화 할 비밀번호, 솔트(해쉬 함수가 작동하는데 필요한 시간과 리소스의 양))
    const hashpassword = await bcrypt.hash(password, 10);

    // users 테이블에 data에 포함된 값들을 토대로 데이터를 생성한다.(password의 경우 해쉬화된 비밀번호를 할당해준다.)
    await prisma.users.create({
      data: {
        email,
        password: hashpassword,
        name,
        age,
        gender,
        interest,
        selfInfo,
      },
    });

    // 생성이 완료됐을 때 반환해주는 반응
    return res.status(201).json({ message: '회원가입이 완료되었습니다.' });
  } catch (error) {
    // try catch로 로직이 실행되는 도중 에러가 발생하면 바로 하단의 에러메시지를 돌려준다.
    res.status(500).json({ message: error.message });
  }
});

'TIL' 카테고리의 다른 글

24.02.14  (0) 2024.02.15
24.02.13  (0) 2024.02.14
24.02.07  (0) 2024.02.07
24.02.06  (0) 2024.02.06
24.02.02  (0) 2024.02.05