2024년 9월 23일
// mariadb.js
// get the client
const mysql = require("mysql2");
// create the connection to database
const connection = mysql.createConnection({
host: "localhost",
user: "root",
password: "root",
timezone: "Asia/Seoul",
database: "Youtube",
dateStrings: true,
});
// 쿼리문 삭제
module.exports = connection;
// users.js
const express = require("express");
const router = express.Router();
const conn = require('../mariadb');
conn.query(
"SELECT * FROM `users`",
function (err, results, fields) {
const { id, email, name, created_at } = results[0];
console.log(id);
console.log(email);
console.log(name);
console.log(created_at);
}
);
router.use(express.json());
... 생략 ...
conn.query를 실제로 API에 넣어보자
개별 조회 쿼리 : SELECT / email 데이터로 회원 정보 조회
- 마이 페이지의 회원 정보 조회 API -> id 데이터 대신 email 데이터로 정보 보여줄 예정
- email를 body에서 받아오기
// users.js
const express = require("express");
const router = express.Router();
const conn = require("../mariadb");
router.use(express.json());
let db = new Map();
let id = 1;
// 개별 조회
router
.route("/users")
.get(function (req, res) {
let { email } = req.body;
conn.query(
`SELECT * FROM users Where email = ${email}`,
function (err, results, fields) {
if(results.length) {
res.status(200).json(results);
} else {
res.status(404).json({
message: `회원 정보가 없어요`,
});
}
}
);
})
... 생략 ...
```
POSTMAN) GET + localhost:7777/users + {”email” : “song@email.com”}
// users.js
// 개별 조회
router
.route("/users")
.get(function (req, res) {
let { email } = req.body;
conn.query(
`SELECT * FROM users Where email = ?`, email,
function (err, results, fields) {
if(results.length) {
res.status(200).json(results);
} else {
res.status(404).json({
message: `회원 정보가 없어요`,
});
}
}
);
})
... 생략 ...
그래도 에러 발생
// mariadb.js
// get the client
const mysql = require("mysql2");
// create the connection to database
const connection = mysql.createConnection({
host: "127.0.0.1",
user: "root",
password: "root",
timezone: "Asia/Seoul",
database: "Youtube",
dateStrings: true,
});
module.exports = connection;
json array 형태로 데이터 잘 받아오는 것을 확인함
// users.js
// 회원 가입
router.post("/join", function (req, res) {
if (req.body == {}) {
res.status(400).json({
message: `입력값을 다시 확인해주세요`,
});
} else {
const {email, name, password, contact} = request.body;
conn.query(
`INSERT INTO users (email, name, password, contact) VALUES (?, ?, ?, ?)`,
[email, name, password, contact], function(err, results, fileds) {
res.status(201).json(results);
}
);
}
});
POSTMAN) POST + localhost:7777/join + {”email” : “kong@email.com”, name: “kong”, “password” : 1234, “contact” : “010-6666-6666”}
// users.js
.delete(function (req, res) {
const {email} = req.body;
conn.query(
`DELETE FROM users WHERE email = ?`, email,
functon(err, results, fields) {
res.status(200).json(results);
}
);
});
// users.js
router.post("/login", function (req, res) {
// 이메일이 db에 저장된 회원인지 확인
const { email, password } = req.body;
let loginUser = {};
conn.query(
`SELECT * FROM users WHERE email = ?`, email,
function(err, results, fields) {
if(results.length) {
loginUser = results[0];
if(loginUser.password == password) {
res.status(200).json({
message: `${loginUser.name}님 로그인 되었어요`,
});
} else {
res.status(400).json({
message: `비밀번호가 틀렸어요`,
});
}
} else {
res.status(404).json({
message: `회원 정보가 없어요`,
});
}
}
);
});
POSTMAN) POST + localhost:7777/login + {”email” : “ko@email.com”, “password”: 1111}
// users.js
router.post("/login", function (req, res) {
const { email, password } = req.body;
conn.query(
`SELECT * FROM users WHERE email = ?`, email,
function(err, results, fields) {
let loginUser = results[0];
if(loginUser && loginUser.password == password) {
res.status(200).json({
message: `${loginUser.name}님 로그인 되었어요`,
});
} else if(loginUser && loginUser.password != password) {
res.status(400).json({
message: `비밀번호가 틀렸어요`,
});
} else {
res.status(404).json({
message: `회원 정보가 없어요`,
});
}
}
);
});
그런데 깔끔히 해보았는데 이전의 코드가 더 좋아보임 → 이전으로 돌리기(리팩토링하는데 의미를 둠)
그리고 요즘에는 아이디 또는 비밀번호를 한번에 틀렸다고 하는게 트렌드임
// users.js
router.post("/login", function (req, res) {
const { email, password } = req.body;
conn.query(
`SELECT * FROM users WHERE email = ?`, email,
function(err, results, fields) {
let loginUser = results[0];
if(loginUser && loginUser.password == password) {
res.status(200).json({
message: `${loginUser.name}님 로그인 되었어요`,
});
} else {
res.status(404).json({
message: `이메일 또는 비밀번호가 틀렸습니다`,
});
}
}
);
});
: 코드 정리를 해보자
// users.js
const express = require("express");
const router = express.Router();
const conn = require("../mariadb.js");
router.use(express.json());
router
.route("/users")
.get(function (req, res) {
let { email } = req.body;
let sql = `SELECT * FROM users WHERE email = ?`;
conn.query(
sql,
email,
function (err, results) {
if (results.length) {
res.status(200).json(results);
} else {
res.status(404).json({
message: `회원 정보가 없어요`,
});
}
}
);
})
.delete(function (req, res) {
const { email } = req.body;
let sql = `DELETE FROM users WHERE email = ?`;
conn.query(
sql,
email,
function (err, results) {
res.status(200).json(results);
}
);
});
router.post("/join", function (req, res) {
if (req.body == {}) {
res.status(400).json({
message: `입력값을 다시 확인해주세요`,
});
} else {
const { email, name, password, contact } = req.body;
let sql = `INSERT INTO users (email, name, password, contact) VALUES (?, ?, ?, ?)`;
let values = [email, name, password, contact]
conn.query(
sql,
values,
function (err, results) {
res.status(201).json(results);
}
);
}
});
router.post("/login", function (req, res) {
const { email, password } = req.body;
let sql = `SELECT * FROM users WHERE email = ?`;
conn.query(
sql,
email,
function (err, results) {
let loginUser = results[0];
if (loginUser && loginUser.password == password) {
res.status(200).json({
message: `${loginUser.name}님 로그인되었어요`,
});
} else {
res.status(404).json({
message: `이메일 또는 비밀번호가 틀렸습니다`,
});
}
}
);
});
module.exports = router;
결과는 똑같이 잘 작동됨
// channels.js
const express = require("express");
const router = express.Router();
const conn = require("../mariadb.js");
router.use(express.json());
router
.route("/:id")
// 채널 개별 조회
.get((req, res) => {
let { id } = req.params;
id = parseInt(id);
let sql = `SELECT * FROM channels WHERE id = ?`;
conn.query(sql, id, function (err, results) {
if (results.length) {
res.status(200).json(results);
} else {
notFoundChannel(res);
}
});
})
POSTMAN) GET+localhost:7777/channels/1
// channels.js
const express = require("express");
const router = express.Router();
const conn = require("../mariadb.js");
router.use(express.json());
router
.route("/")
// 채널 전체 조회
.get((req, res) => {
const { userId } = req.body;
let sql = `SELECT * FROM users WHERE user_id = ?`;
conn.query(sql, userId, function (err, results) {
if (results.length) {
res.status(200).json(results);
} else {
notFoundChannel(res);
}
});
})
POSTMAN) GET+localhost:7777/channels + {”userId” : 1}
userId 넣지 않으면
오류 해결 -> 단축 평가 이용
// channels.js
const express = require("express");
const router = express.Router();
const conn = require("../mariadb.js");
router.use(express.json());
router
.route("/")
// 채널 전체 조회
.get((req, res) => {
const { userId } = req.body;
let sql = `SELECT * FROM users WHERE user_id = ?`;
userd && conn.query(sql, userId, function (err, results) {
if (results.length) {
res.status(200).json(results);
} else {
notFoundChannel(res);
}
});
res.status(400).end();
})
결과 : userId 값이 있으면 단축평가 뒤의 내용과 res.status(400).end()를 모두 읽어 덮어 쓰기 됨
강의에서는 어떻게 하면 좋을까? 생각 해보라고 했는데 내 생각에는 return을 넣어야 할 것 같음.. (나중에 알려주신다고 함!)
// channels.js
const express = require("express");
const router = express.Router();
const conn = require("../mariadb.js");
router.use(express.json());
router
.route("/")
// 채널 전체 조회
.get((req, res) => {
const { userId } = req.body;
let sql = `SELECT * FROM users WHERE user_id = ?`;
if(userId) {
conn.query(sql, userId, function (err, results) {
if (results.length) {
res.status(200).json(results);
} else {
notFoundChannel(res);
}
});
} elese {
res.status(400).end();
}
})
// channels.js
// 채널 개별 생성
.post((req, res) => {
if (req.body.name) {
const { name, userId } = req.body;
let sql = `INSERT INTO channels (name, user_id) VALUES (?, ?)`;
let values = [name, userId];
conn.query(sql, values, function (err, results) {
res.status(201).json(results);
});
} else {
res.status(400).json({
message: `요청 값을 다시 보내주세요`,
});
}
});
POSTMAN) localhost:7777/channels + {”name” : “bbang”, “userId” : 3}
그런데, userId 값이 이상해도 성공됨(그런데 데이터는 들어가지 않음)
🍏🍎 오늘의 느낀점
: db 연동을 해서 users.js와 channels.js를 쿼리문을 넣어서 해보는 실습을 가졌다..! 배열을 이용했을 때보다 코드가 조금 더 쉽게(?) 느껴지기는 했지만, 예외 처리를 잘 처리해야할 것 같다. 요번에 같이 실습을 같이 해보고 다른 사이드 프로젝트를 해보면서 익숙해져야겠다. 다음 강의도 화이팅..!