HTTP 상태 코드(200, 404, 500 등)를 숫자 대신 의미 있는 상수 이름으로 사용하게 해주는 라이브러리
npm i http-status-codes
import { StatusCodes, ReasonPhrases } from 'http-status-codes';
// 상태 코드 사용
res.status(StatusCodes.OK).send(ReasonPhrases.OK); // 200 OK
res.status(StatusCodes.NOT_FOUND).send(ReasonPhrases.NOT_FOUND); // 404 Not Found
res.status(StatusCodes.BAD_REQUEST).send(ReasonPhrases.BAD_REQUEST); // 400 BAD_REQUEST
이걸 내 코드에서 보자면 이런 느낌이야. const로 statuscode 불러와주고
const express = require("express"); //express 모듈
const router = express.Router();
const connection = require("../mariadb"); // db모듈
const { StatusCodes } = require("http-status-codes");
router.use(express.json());
//router쓸꺼면 use필요해 너 오브젝트 post형태로 값이 들어오는 거면 json 형태로 들어올텐데, 그러면 use추가해야해 라는 뜻
//회원가입
router.post("/join", (req, res) => {
const { email, password } = req.body;
let sql = "INSERT INTO users (email, password) VALUES (?, ?)";
let values = [email, password];
connection.query(sql, values, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
res.status(StatusCodes.CREATED).json(results);
});
201이나, 400 띄워주는 곳에 StatusCodes.CREATED 같은거 쓰면 돼. 201이라 CREATED이고
400은 BAD_REQUEST
app.js : 프로젝트의 메인 라우터 역할
/user.js : 하위 라우터 역할 = 경로를 찾아주는 역할
/books.js : 하위 라우터 역할
⇒ 즉, 유지보수 하기 어려워진다.
cf. 유지보수란? 오랜 시간동안 운영하면서 요구사항을 반영하고 에러를 해결하는 것
—> 즉, 코드를 간결하고 가독성을 높게 만들어줘야 한다.
경로를 찾은 다음 역할 ⇒ ‘콜백 함수’를 분리하자
⇒ 즉, 라우터를 통해서 “사용자 요청(req)”이 길(URL)을 찾아오면,
⇒ 매니저(콜백함수 = controller)가 환영해줌 //지금은 일단 같다고 보자.
⇒ 알바생(서비스)에게 일을 시키고, 알바생이(서비스가) 일을 다 하면 -> 결과물을 매니저에게 다시 전달
⇒ 매니저(controller)가 사용자에게 res 전달
아래 느낌으로 controller 폴더를 만들어서 userController파일을 따로 만들어준 다음
원래 route의 users.js에 써준 것들을 모듈로써 하나씩 불러와서 사용할 수 있어!! 아래 코드 잘 읽어봐 특히 주석부분을!
const connection = require("../mariadb"); // db모듈
const { StatusCodes } = require("http-status-codes");
//따로 컨트롤러로 빼주는거야 기능을. 왜냐면 route는 경로를 나타내주는 친구인데, 저렇게 기능이 많아지면 헷갈리잖아 그래서 기능별로 컨트롤러로 빼주는거지
//그래서 그걸 가지고 모듈을 만드는 건데 어떻게 만드냐면
const jwt = require("jsonwebtoken"); //jwt 모듈
const dotenv = require("dotenv"); //env 모듈 쓸려고 dot env한거야.
dotenv.config(); //이거 해줘야지 .env 파일을 인식해
const join = (req, res) => {
const { email, password } = req.body;
let sql = "INSERT INTO users (email, password) VALUES (?, ?)";
let values = [email, password];
connection.query(sql, values, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.CREATED).json(results);
});
};
const login = (req, res) => {
const { email, password } = req.body;
let sql = "SELECT * FROM users WHERE email = ? AND password = ?";
let values = [email, password];
connection.query(sql, values, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
//여기가 로그인 성공 로직이면서 토큰 발급 로직이야
const loginUser = results[0];
if (loginUser && loginUser.password == password) {
const token = jwt.sign(
{
email: loginUser.email,
},
process.env.PRIVATE_KEY,
{
expiresIn: "1h", //1시간 유효
issuer: "songa",
}
);
res.cookie("token", token, {
httpOnly: true, //너 이거 http에서만 쓸 수 있어
});
console.log(token);
return res.status(StatusCodes.OK).json(results);
} else {
return res.status(StatusCodes.UNAUTHORIZED).end(); //401 이고 인증이 안되었어! 라는 뜻
}
});
};
const passwordResetRequest = (req, res) => {
res.json("비밀번호 초기화 요청");
};
const passwordReset = (req, res) => {
res.json("비밀번호 초기화");
};
module.exports = { join, login, passwordResetRequest, passwordReset };
//이렇게 기능별로 컨트롤러를 만들어서 route에서 불러다 쓰는거지
그러고 users.js에서는 !
const express = require("express"); //express 모듈
const router = express.Router();
const connection = require("../mariadb"); // db모듈
const {
join,
login,
passwordReset,
passwordResetRequest,
} = require("../controller/UserController"); //컨트롤러 모듈 이렇게 불러와주면 돼! 쉽죠?
router.use(express.json());
//router쓸꺼면 use필요해 너 오브젝트 post형태로 값이 들어오는 거면 json 형태로 들어올텐데, 그러면 use추가해야해 라는 뜻
//회원가입
router.post("/join", join);
//로그인
router.post("/login", login);
//비밀번호 초기화 요청
router.post("/reset", passwordReset);
//비밀번호 초기화
router.put("/reset", passwordResetRequest);
//이걸 모듈로 쓴다고 했으니 export를 해줘야해!
module.exports = router;
이렇게 정말 간단하게 표현을 해줄 수가 있지.