Jake's Board - Side Project

이재익·2019년 11월 29일
0

Jake's Board

목록 보기
1/2
post-custom-banner

4주 프로젝트에서 GraphQL을 사용해서 인지 REST API 서버에 대한 개념이 모호해진 것 같아서
작은 사이즈의 프로젝트로 게시판 기능을 만들어 보려고 한다.

오늘 만든 기능은 이메일 인증 기능으로 개.고.수 프로젝트에서 사용했던 기능인데
그 땐 sendgrid 서비스를 이용했지만 이번엔 Gmail 서비스를 이용해보았다.

1. 이메일 보내기

export const generateNumber = () => {
  const randNum = Math.floor(Math.random() * 10000);
  return randNum;
};

먼저 랜덤한 숫자를 만들어내는 함수를 만들어준다.

import nodeMailer from "nodemailer";

const { GMAIL, MAILPASS } = process.env;

const transport = {
  service: "gmail",
  auth: {
    user: GMAIL,
    pass: MAILPASS
  }
};

export const sendMail = (email, randNum) => {
  const mailtransport = nodeMailer.createTransport(transport);

  const options = {
    from: "jake@gmail.com",
    to: email,
    subject: "email Auth",
    html: `signUp email number ${randNum}`
  };

  return new Promise((resolve, reject) => {
    mailtransport.sendMail(options, (err, _) => {
      if (err) {
        reject(err);
      } else {
        resolve(true);
      }
    });
  });
};

그 후에 nodemailer 모듈을 이용하여 transport와 options를 설정하여 입력 받은 이메일로
랜덤 숫자를 보내주는 함수를 만들어 준다.

//userController 파일
export const emailSend = async (req, res) => {
  const { email } = req.body;

  try {
    const user = await User.findOne({ where: { email } });

    if (user) {
      res.status(400);
      res.send(false);
    } 
};

body로 들어온 emailUser 테이블에서 찾은 뒤 데이터가 있다면
이미 가입한 이메일이기에 더 이상 회원가입을 못하게 막아준다.

else {
      const randNum = generateNumber();
      const result = await sendMail(email, randNum);

      if (result) {
        emailStorage[email] = randNum;

        res.status(200);
        res.send(true);
      }
    }
  } catch (err) {
    res.status(500);
    res.send(err);
  }

하지만 User 테이블에 이메일이 없다면 generateNumber()함수와 sendMail() 함수를 이용하여 이메일을 보내준다.
그리고 emailStorage라는 객체를 하나 만들고 그 곳에 emailrandNum을 저장해둔다.

개.고.수 프로젝트에는 db에 email을 저장하고 인증이 될 때마다 db에 있는 데이터를 삭제하고 이메일을 보내줄 때에는 저장하는 방식을 이용했는데 굳이 db를 이용하지 않아도 될 것 같았기에 방법을 조금 바꿔봤다.

2. 인증 번호 확인하기

export const emailAuth = (req, res) => {
  const { email, number } = req.body;

  if (emailStorage[email] === Number(number)) {
    delete emailStorage[email];

    res.status(200);
    res.send(true);
  } else {
    res.status(400);
    res.send(false);
  }
};

emailStorage 객체에 저장되어있는 숫자와 비교해서 결과를 반환한다.

profile
열정 있는 개발자
post-custom-banner

0개의 댓글