개발자/미니프로젝트 rest-api
5. 프론트에 회원가입버튼 알아보기
YoungDogg
2022. 1. 26. 20:56
인증번호가 확인된다면 나머지를 입력하고 회원가입버튼을 누른다.
프론트 signup.js
// 회원 가입 API 요청
const submitSignup = async () => {
let personalInfo = {
name: String(document.getElementById(`SignupName`).value),
personal: "",
phone: "",
favoriteSite: String(document.getElementById(`SignupPrefer`).value),
email: String(document.getElementById(`SignupEmail`).value),
password: String(document.getElementById(`SignupPwd`).value),
};
for (let i = 1; i <= 2; i++) {
personalInfo.personal += String(
document.getElementById(`SignupPersonal${i}`).value
);
}
phone = "";
for (let i = 1; i <= 3; i++) {
personalInfo.phone += String(
document.getElementById(`PhoneNumber0${i}`).value
);
}
// 플래그 만들어서 입력이 다 됐는지 확인
let isGood2Go = false;
for (let key in personalInfo) {
if (!personalInfo[key]) {
isGood2Go = false;
// =============경고창 나오게 하기 ====================
let missingAlert = document.createElement("div");
missingAlert.innerHTML = "빠뜨린 거 있다! : " + key;
alert(missingAlert.outerHTML);
return -1;
} else {
isGood2Go = true;
}
// console.log(key + " : " + personalInfo[key]);
}
// 만약 모든 조건이 다 됐다면
if (isGood2Go) {
axios
.post(`http://localhost:3000/users`, {
name: personalInfo.name,
personal: personalInfo.personal,
phone: personalInfo.phone,
favoriteSite: personalInfo.favoriteSite,
email: personalInfo.email,
password: personalInfo.password,
})
.then((req, res) => { // 이 부분은 백엔드의 /users post가 완료된 후에 실행된다
CloseModal();
let okAlert = document.createElement("div");
okAlert.innerHTML = "회원가입 성공!";
alert(okAlert.outerHTML);
return;
});
}
};
입력값이 빠졌는지 확인하고 됐다면 /users 의 post로 받은 값들을 보내준다.
백엔드
index.js
import express from "express";
import swaggerUi from "swagger-ui-express";
import swaggerJsdoc from "swagger-jsdoc";
import dotenv from "dotenv";
import mongoose from "mongoose";
import cors from "cors";
import { options } from "./swagger/config.js";
import { TokenController } from "./controllers/token_controller.js";
import { UsersController } from "./controllers/users_controller.js";
import { StarbucksController } from "./controllers/starbucks_controller.js";
const app = express();
app.use(express.json());
app.use(cors());
app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerJsdoc(options)));
dotenv.config();
const tokenController = new TokenController();
app.get("/tokens/phone", tokenController.getToken);
app.post("/tokens/phone", tokenController.postToken);
app.patch("/tokens/phone", tokenController.patchToken);
const usersController = new UsersController();
app.get("/users", usersController.getUsers);
app.post("/users", usersController.postUsers); // 여기로 받는다.
const starbucksController = new StarbucksController();
app.get("/starbucks", starbucksController.getStarbucks);
mongoose.connect("mongodb://my_database:27017/codecamp");
app.listen(3000);
token_controllerd.js class TokenController 일부분
postUsers = async function (req, res) {
let { name, email, personal, phone, favoriteSite, password, isAuth } = req.body;
let tokenPhone;
let isAuthFromDB;
try {
// 휴대폰 인증전송 버튼을 누르지 않았을 경우, 에러를 보낸다
tokenPhone = await Token.findOne({ phone: phone });
isAuthFromDB = tokenPhone.isAuthFromDB;
console.log(`tokenPhone: ${tokenPhone}, isAuthFromDB: ${isAuthFromDB}`);
} catch (err) {
res.status(422).send("에러!!! 핸드폰 번호가 인증되지 않았습니다. 인증전송 버튼을 누르세요.");
return;
}
// 1. email이 정상인지 확인(eamil 존재 여부, @포함여부)
if (email === undefined || !email.split("").includes("@")) {
res.send("이메일 형식이 올바르지 않습니다.");
return;
}
if (!isAuthFromDB ) {
console.log("토큰 인증이 올바르지 않습니다.");
return;
} else {
const ogs = await getOpenGraph(favoriteSite);
const user = new Users({
name: name,
email: email,
personal: personal.substring(0, 6) + "-*******",
phone: phone,
favoriteSite: favoriteSite,
password: password,
og: {
title: ogs.title,
description: ogs.description,
image: ogs.image,
},
});
sendTempToEmail(
name,
email,
getWelcomeTemplate(name, personal, favoriteSite)
);
await user.save(); // 몽고디비로 저장된다. 좀 기다려줘
console.log("=====================user._id=============");
console.log(user._id);
res.send(user._id);
return;
}
};
여기서도 token/phone에서 체크한 것처럼 폰번호, 토큰을 확인한다. 만약 있다면 이메일도 보내고 디비에 저장도 한다.