23.3.1 회원가입 구현하기

    src/api/auth 디렉터리에 auth.ctrl.js 파일을 만들고 register 함수를 다음과 같이 작성해 보세요.

    src/api/auth/auth.ctrl.js

    import Joi from 'joi';
    import User from '../../models/user';
    
    /*
      POST /api/auth/register
      {
        username: 'velopert',
        password: 'mypass123'
      }
    */
    export const register = async ctx => {
      // Request Body 검증하기
      const schema = Joi.object().keys({
        username: Joi.string()
          .alphanum()
          .min(3)
          .max(20)
          .required(),
        password: Joi.string().required(),
      });
      const result = Joi.validate(ctx.request.body, schema);
      if (result.error) {
        ctx.status = 400;
        ctx.body = result.error;
        return;
      }
    
      const { username, password } = ctx.request.body;
      try {
        // username 이미 존재하는지 확인
        const exists = await User.findByUsername(username);
        if (exists) {
          ctx.status = 409; // Conflict
          return;
        }
    
        const user = new User({
          username,
        });
        await user.setPassword(password); // 비밀번호 설정
        await user.save(); // 데이터베이스에 저장
    
        // 응답할 데이터에서 hashedPassword 필드 제거
        const data = user.toJSON();
        delete data.hashedPassword;
        ctx.body = data;
      } catch (e) {
        ctx.throw(500, e);
      }
    };

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.