데브코스 TIL - Day 25
23년 12월 21일 강의를 들은 내용과 추가로 학습한 내용을 기록한 글입니다.
db 모듈화하기
- mysql 모듈 가져오고, db연결하는 코드를 모듈화 시키기
1
2
3
4
5
6
7
8
9
10
11
12
const mysql = require("mysql2");
// create the connection to database
const connection = mysql.createConnection({
host: "localhost",
user: "root",
database: "yotube",
password: "1234567a",
dateStrings: true
});
module.exports = connection;
- 모듈화된 db를 users 파일에 가져와서 사용하기
1
2
3
4
5
6
7
const express = require("express");
const router = express.Router();
// db 받아오기
const conn = require("../mysql");
// ... 중략
유저 정보 가져오는 코드 수정하기
API 설계 수정
회원 정보 조회 (GET, SELECT, /users)
- req: req.body (email)
- res: id, name
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
router.route("/users").get((req, res) => {
const { email } = req.body;
conn.query(
"SELECT * FROM users WHERE email = (?)",
[email],
(err, results, fields) => {
if (results.length > 0) {
res.status(200).send(results[0]);
} else {
res.status(404).send({ message: "일치하는 아이디가 없습니다." });
}
}
);
});
결과
회원가입 코드 수정하기
API 설계 수정
회원가입 (POST, INSERT, /join)
- req: body(email, pwd, name, contact)
- res:
${name}님 환영합니다.
- 로그인페이지 출력
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
router.post("/join", (req, res) => {
if (req.body == {}) {
res
.status(400)
.send({ message: "잘못된 요청입니다. 입력값을 다시 확인해주세요" });
} else {
const { email, pwd, name, contact } = req.body;
conn.query(
"INSERT INTO users (email,name,password,contact) VALUES (?,?,?,?)",
[email, name, pwd, contact],
(err, results, fields) => {
res.status(201).send({ message: `${name}님, 환영합니다.` });
}
);
}
});
INSERT
는results
값을 넘겨주지 않는다.
회원 탈퇴 코드 수정
API 설계 수정
회원 탈퇴 (DELETE, DELETE, /users/:id)
- req: body(email)
- res:
${name}님 탈퇴가 완료되었습니다.
- 메인페이지 출력
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
router.delete((req, res) => {
const { email } = req.body;
conn.query(
"DELETE FROM users WHERE email = ? ",
[email],
(err, results, fields) => {
if (results.affectedRows > 0) {
res.status(200).send(results);
}
}
);
});
results.affectedRows
를 가지고 성공여부를 판단- 프론트엔드와 이야기를 나눠야 함 (경우마다 다름)
결과 - 성공했을 때
1
2
3
4
5
6
7
8
9
ResultSetHeader {
fieldCount: 0,
affectedRows: 1,
insertId: 0,
info: '',
serverStatus: 2,
warningStatus: 0,
changedRows: 0
}
결과 - 실패했을 때
1
2
3
4
5
6
7
8
9
ResultSetHeader {
fieldCount: 0,
affectedRows: 0,
insertId: 0,
info: '',
serverStatus: 2,
warningStatus: 0,
changedRows: 0
}
로그인 코드 수정
API 설계 수정
로그인 (POST, SELECT, /login)
- req: body(email, pwd)
- res:
${name}님 환영합니다.
- 메인페이지 출력
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
router.post("/login", (req, res) => {
const { email, pwd } = req.body;
conn.query(
"SELECT * FROM users WHERE email = ?",
[email],
(err, results, fields) => {
const [isMatchedEmail] = results;
if (isMatchedEmail) {
if (isMatchedEmail.password === pwd) {
res
.status(200)
.send({ message: `${isMatchedEmail.name}님, 환영합니다.` });
} else {
res.status(400).send({ message: "비밀번호가 일치하지 않습니다." });
}
} else {
res.status(400).send({ message: "일치하는 이메일이 없습니다." });
}
}
);
});
- 요즘 트렌드는 아이디와 비밀번호 일치여부를 각각 알려주지 않고, 한꺼번에 알려줌
- 하지만… 사용자 입장에서는 어느게 틀렸는지 모르기때문에 아이디 찾기 -> 비밀번호 찾기 순으로 틀린 정보를 찾는데 시간을 더 소비함..
- 나는 요즘 트렌드를 따르는 코드 말고 코드는 더 길지만 디테일한 예외처리를 선택함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
router.post("/login", (req, res) => {
const { email, pwd } = req.body;
conn.query(
"SELECT * FROM users WHERE email = ?",
[email],
(err, results, fields) => {
const [matchedEmail] = results;
if (matchedEmail && matchedEmail.password === pwd) {
res
.status(200)
.send({ message: `${matchedEmail.name}님, 환영합니다.` });
} else {
res
.status(400)
.send({ message: "이메일 또는 비밀번호가 일치하지 않습니다." });
}
}
);
});
전체 코드 - users.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
const express = require("express");
const router = express.Router();
const conn = require("../mysql");
router.use(express.json());
router.post("/join", (req, res) => {
if (req.body == {}) {
res
.status(400)
.send({ message: "잘못된 요청입니다. 입력값을 다시 확인해주세요" });
} else {
const { email, pwd, name, contact } = req.body;
const sql =
"INSERT INTO users (email,name,password,contact) VALUES (?,?,?,?)";
const values = [email, name, pwd, contact];
conn.query(sql, values, (err, results, fields) => {
res.status(201).send({ message: `${name}님, 환영합니다.` });
});
}
});
router.post("/login", (req, res) => {
const { email, pwd } = req.body;
const sql = "SELECT * FROM users WHERE email = ?";
conn.query(sql, [email], (err, results) => {
const [matchedEmail] = results;
if (matchedEmail) {
if (matchedEmail.password === pwd) {
res
.status(200)
.send({ message: `${matchedEmail.name}님, 환영합니다.` });
} else {
res.status(400).send({ message: "비밀번호가 일치하지 않습니다." });
}
} else {
res.status(400).send({ message: "일치하는 아이디가 없습니다." });
}
});
});
router
.route("/users")
.get((req, res) => {
const { email } = req.body;
const sql = "SELECT * FROM users WHERE email = (?)";
conn.query(sql, [email], (err, results) => {
if (results.length > 0) {
res.status(200).send(results[0]);
} else {
res.status(404).send({ message: "일치하는 아이디가 없습니다." });
}
});
})
.delete((req, res) => {
const { email } = req.body;
const sql = "DELETE FROM users WHERE email = ? ";
conn.query(sql, [email], (err, results) => {
if (results.affectedRows > 0) {
res.status(200).send(results);
}
});
});
module.exports = router;
This post is licensed under CC BY 4.0 by the author.