리팩토링 정리
1. 불필요한 코드 (Map 객체 잔재) + console.log 삭제, if 중괄호 통일
2. 코드로 설명이 안되는 부분에 주석 작성 그외에는 주석 삭제
3. 문자열의 경우 값을 빼서 문자열 자체로 넣기보다 변수로 지정해서 변수를 입력하기(ex. sql)
4. 모든 callback 함수에 express-validator의 err값 호출이 들어가기 때문에 해당 코드는 모듈화 하여 코드에서 빼 작성
const express = require("express");
const router = express.Router();
const conn = require("../mariadb");
const { body, param, validationResult } = require("express-validator");
const validate = (req, res, next) => {
const err = validationResult(req);
if (err.isEmpty()) {
return next();
}
return res.status(400).json(err.array());
};
router
.route("/")
.post(
[
body("email")
.notEmpty()
.withMessage("이메일을 입력해주세요")
.isEmail()
.withMessage("이메일 형식이 아닙니다."),
body("title")
.notEmpty()
.withMessage("채널명을 입력해주세요.")
.isString()
.withMessage("채널명은 문자열만 받습니다."),
validate
],
async (req, res) => {
let { title, description, email } = req.body;
const select_user_sql = "select * from users where email = ?";
let user_id = "";
try {
const [[data]] = await conn.query(select_user_sql, email);
user_id = data.id;
} catch (err) {
return res.status(404).json({
message: "존재하지 않는 유저 입니다."
});
}
const select_sql = "select * from channels where title = ?";
try {
const [[hasChannel]] = await conn.query(select_sql, title);
if (hasChannel) {
return res.status(409).json({
message: "이미 존재하는 채널명입니다."
});
}
} catch (err) {
return res.status(404).end();
}
const insert_sql =
"insert into channels (title, description, user_id) values (?,?,?)";
const insert_values = [title, description, user_id];
try {
await conn.query(insert_sql, insert_values);
res.status(201).json({
message: `${title} 채널을 응원합니다.`
});
} catch (err) {
res.status(404).end();
}
}
)
.get(
[
body("user_id")
.notEmpty()
.withMessage("user_id를 입력해주세요")
.isInt()
.withMessage("user_id 데이터가 잘못입력되었습니다."),
validate
],
async (req, res) => {
const { user_id } = req.body;
try {
const select_sql = "select * from channels where user_id = ?";
const [data] = await conn.query(select_sql, [user_id]);
if (data.length === 0) {
notFoundChannel(res);
return;
}
res.status(200).json(data);
} catch (err) {
return res.status(400).end();
}
}
);
router
.route("/:id")
.put(
[
param("id").notEmpty().withMessage("채널번호가 없습니다."),
body("title").notEmpty().withMessage("제목을 입력하세요"),
validate
],
async (req, res) => {
let { id } = req.params;
id = parseInt(id);
const { title, description } = req.body;
const update_sql =
"update channels set title = ? , description = ? where id = ?";
const values = [title, description, id];
try {
const [data] = await conn.query(update_sql, values);
if (data.affectedRows == 0) {
return notFoundChannel(res);
}
res.status(200).json({
message: `채널명이 ${title}(으)로, 수정이 완료되었습니다.`
});
} catch (err) {
console.log(err);
return res.status(400).end();
}
}
)
.delete(
[param("id").notEmpty().withMessage("채널번호 필요"), validate],
async (req, res) => {
let { id } = req.params;
id = parseInt(id);
const delete_sql = "delete from channels where id = ?";
try {
const [data] = await conn.query(delete_sql, id);
if (data.affectedRows == 0) {
return notFoundChannel(res);
}
res.status(200).json({
message: `그동안 유튜브를 이용해 주셔서 감사합니다.`
});
} catch (err) {
return res.status(400).end();
}
}
)
.get(
[param("id").notEmpty().withMessage("id 값이 없습니다."), validate],
async (req, res) => {
let { id } = req.params;
id = parseInt(id);
const select_sql = "select * from channels where id = ?";
try {
const [[user]] = await conn.query(select_sql, id);
if (!user) {
notFoundChannel(res);
return;
}
res.status(200).json(user);
} catch (err) {
return res.status(400).end();
}
}
);
function notFoundChannel(res) {
res.status(404).json({
message: "채널 정보를 찾을 수 없습니다"
});
}
module.exports = router;
'프로젝트 > 1.youtube-project' 카테고리의 다른 글
회원 리팩토링 코드 (0) | 2023.12.22 |
---|---|
[실전]미니 프로젝트 - channel과 user ERD를 생각해보자 (0) | 2023.12.17 |
[실전]미니 프로젝트 - 서버에서 router관리하기 (0) | 2023.12.17 |
[실전]미니 프로젝트 - 채널 전체 "조회" (0) | 2023.12.16 |
[실전]미니 프로젝트 - 채널 개별 "수정" (0) | 2023.12.15 |