status-code 및 node.js패키지 구조

데브코스

목록 보기
61/133

http-status-code

HTTP 상태 코드(200, 404, 500 등)를 숫자 대신 의미 있는 상수 이름으로 사용하게 해주는 라이브러리

  • 401 : Unauthorized

설치방법

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


Node.js 패키지(파일) 구조

app.js : 프로젝트의 메인 라우터 역할

/user.js : 하위 라우터 역할 = 경로를 찾아주는 역할

/books.js : 하위 라우터 역할

❗라우터가 로직까지 전부 수행할 시 단점

  1. 프로젝트 규모가 커질 수록, 코드가 매우 복잡해짐
  2. 가독성이 떨어짐
  3. 트러블 슈팅 또한 처리하기 어려워짐

⇒ 즉, 유지보수 하기 어려워진다.

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;

이렇게 정말 간단하게 표현을 해줄 수가 있지.

profile
Dive Head First | Work Super Hard | Attract Great People

0개의 댓글