코드 분리를 이미 만든 한 파일에서 해보고, 한 branch에 올렸는데,
그 이후 바로
처음부터 여러 branch에 올리니
app.post("/login", 로 써야 할지, const signup. 으로 써야할지
연결하는 함수는 어디에 들어가야할지 헷갈렸다.
그래서 우선, 깃허브에 올라온 이전 팀의 동기 코드가 로그인 성공했다고 해서
참고했다.
일단, 나는 내 로컬에서 여러 branch를 다 올리기에
분업한 후 merge 하는 팀과는 방식이 달랐다.
// 동기 -userservice (연두색 부분은 나에게 없던 것/
const { DataSource } = require('typeorm')
const dotenv = require('dotenv')
const jwt = require('jsonwebtoken')
const bcrypt = require('bcrypt')
dotenv.config() // 두 줄 합쳐서 나는 require("dotenv").config();
const myDataSource = new DataSource({
type : process.env.DB_TYPE, // 나는 CONNECTION
host : process.env.DB_HOST,
port : process.env.DB_PORT,
username : process.env.DB_USER, // 나는 USERNAME
password : process.env.DB_PASSWORD,
database : process.env.DB_NAME /// 나는 DATABASE
})
myDataSource.initialize() .then(() => {
console.log("Data Source has been initialized!_userService") // 나는 구분을 안 해줬구나 -> 나중에 어떤 차이일지 궁금
})
//회원가입
const userSignup = async(req, res) => {
try {
const me = req.body;
console.log("ME : ", me);
const {nickname, email, password } = me;
//이메일 정규화 (3)
let regex = new RegExp('[a-z0-9]+@[a-z]+\.[a-z]{2,3}');
if(regex.test(email) == false){
const error = new Error("DISABLE_EMAIL");
error.statusCode = 400;
error.code = "DISABLE_EMAIL"
throw error
}
// 나는
const emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;
const extractedEmails = email.match(emailRegex);
if (!email.match(emailRegex)) {
const error = new Error("특수문자 사용 안함");
error.statusCode = 400;
throw error;
}
console.log(extractedEmails);
//email, name, password가 다 입력되지 않은 경우. (1)
if(nickname === undefined || email === undefined || password === undefined){
const error = new Error("KEY_ERROR")
error.statusCode = 400
error.code = "KEY_ERROR"
throw error
}
//비밀번호가 너무 짧을 때 (4)
if(password.length < 10){
const error = new Error("INVALID_PASSWORD")
error.statusCode = 400
error.code = "INVALID_PASSWORD"
throw error
}
//이메일 중복 가입. (2)
//1. 유저가 입력한 이메일이 이미 우리 DB에 있는지 확인
const existingData = await myDataSource.query(`
SELECT id, email FROM users WHERE email = '${email}'
`)
console.log("user : " , existingData)
// 2. 있으면 에러
if(existingData.length != 0){ // 나는 existingUser.length > 0
const error = new Error("alreadyEmail")
error.statusCode = 400
error.code = "alreadyEmail"
throw error
}
//비밀번호에 특수문자 없을 때
const specialKey = /[~!@#$%^&*()_+|{}]/; //특수문자
if(specialKey.test(password) == false) {
const error = new Error("passwordNeedSpecial")
error.statusCode = 400
error.code = "passwordNeedSpecial"
throw error
}
//비밀번호 암호화
const saltRounds = 10;
const hashedPw = await bcrypt.hash(password, saltRounds);
const userData = await myDataSource.query(`
INSERT INTO users (
nickname,
email,
password
) VALUES (
'${nickname}',
'${email}',
'${hashedPw}'
)
`)
console.log("signUpSuccess");
console.log("New User : ", userData);
//FRONT 전달
return res.status(201).json({
"code" : "signUpSuccess"
})
} catch (error) {
console.log(error)
return res.status(400).json(error)
}
}
//로그인
const userLogin = async(req, res) => {
try {
const { email, password } = req.body;
// 나는
// const email = req.body.email;
// const password = req.body.password;
//Email을 가진 사람 있는지 확인 (2)
const userEmail = await myDataSource.query(`. //나는 existinguser로 했는데, 알아보는데 ★편한 변수인듯
SELECT id, email, password FROM users WHERE email = '${email}'
`)
//Email pw KEY_ERROR 확인 (1)
if(email === undefined || password === undefined){
const error = new Error("KEY_ERROR")
error.statusCode = 400
error.code = "KEY_ERROR"
throw error
}
//if 유저 이메일이 없으면 -> 없는 유저라고 출력
if(userEmail.length === 0){
const error = new Error("emptyEmail"). //duplicated emaill 로 내가 잘못 메세지 설정한 것을 알 게 됨"EMAIL_Unexist"
error.statusCode = 400
error.code = "emptyEmail" // 나는 400
throw error
}
//없으면 -> 정상 진행
// 동기 님은 해당 이메일 소유자의 비밀번호 일치 확인을 해쉬로 하심
//찐 비번이랑 암호화 해서 DB에 있는 비번 비교
const hashPw = await bcrypt.compare(password, userEmail[0].password);
//if false라면 -> 없는 비번이라고 출력
if(!hashPw){
const error = new Error("passwordError")
error.statusCode = 400
error.code = "passwordError"
throw error
}
//같으면 -> 정상 진행
//payload로 전달할 내용인 해당 유저의 id값
const userId = userEmail[0].id;
const token = jwt.sign({"id" : userId }, process.env.TYPEORM_JWT)
// 나는 const token = jwt.sign({id : userEmail[0].id}, 'password')
console.log("loginSuccess")
return res.status(200).json({
"code" : "logInSuccess",
"accessToken" : token
})
} catch (error) {
console.log(error)
return res.status(400).json(error)
}
}
module.exports = {
userSignup,
userLogin
}
//나는 getUsers도 했다 . 프론트가 나중에 받아갈때를 위해.. 없어도 되나>?
'Wecode - Project 1 (부트캠프) > Project 1 과정' 카테고리의 다른 글
Project 1- 3일차 : 코드 리뷰, 비교 - threadService / 포스트 Posting 목록 조회, 생성 (0) | 2023.09.14 |
---|---|
Project 1- 3일 차: 경래 멘토님 [코드 리뷰] - app.js 뜯어보기 + Layered Pattern (0) | 2023.09.14 |
Project1- 2일차: 초기세팅 PR 후 commit (2), 깃허브에 다 딸려 올라갔을 때 (0) | 2023.09.12 |
Project1- 2일 차: 초기세팅 PR 후 commit (1) (0) | 2023.09.12 |
Project 1 - 1일 차: "초기환경" 세팅 [체크리스트] (0) | 2023.09.11 |