express 모듈에서 req와 res와 next

데브코스

목록 보기
50/131

전에 코드를 올려둔 것 처럼하니,
포스트맨에서 값을 불러오지 못하고 계속 값을 찾는 오류가 생겼었다.

그래서 그 문제를 해결하기 위해 next라는 새로운 방식을 사용해보려고 한다.


const validate = (req, res, next) => {
  //이렇게하면 하나의 미들웨어 방식으로 사용할 수 있어.
  const err = validationResult(req);

  if (!err.isEmpty()) {
    return res.status(400).json(err.array());
  } else {
    return next(); //다음 할 일 찾아가봐 (미들웨어, 함수 등으로)
  }
};

이렇게 하나의 검사를 변수에 담아서 기능을 사용하려고 하면
next를 통해서 값이 없다면 오류를 보내지만
만약 값이 있었다면, 다음 할 일을 찾아가서 계속 작업을 진행해! 라는 의미로 사용한다.


그래서 전체 코드를 이 next를 적용해서 클린하게 만들어 보자면

const express = require("express");
const router = express.Router();
const connection = require("../mariadb");
const { body, param, validationResult } = require("express-validator");

router.use(express.json());

const validate = (req, res, next) => {
  //이렇게하면 하나의 미들웨어 방식으로 사용할 수 있어.
  const err = validationResult(req);

  if (err.isEmpty()) {
    return next(); //다음 할 일 찾아가봐 (미들웨어, 함수 등으로)
  } else {
    return res.status(400).json(err.array());
  }
};

//채널 개별 생성
router

  .route("/")
  .get(
    //조회
    [body("userId").notEmpty().isInt().withMessage("숫자입력필요"), validate], //이렇게 사용해서 유효성 검사를 하고 에러가 난다면 바로 보여줄 수 있도록 함.
    (req, res, next) => {
      var { userId } = req.body;
      const sql = `SELECT * FROM channels WHERE user_id = ?`;

      connection.query(sql, userId, function (err, results) {
        if (err) {
          console.log(err);
          return res.status(400).end();
        }

        if (results.length) {
          res.status(200).json(results);
        } else {
          notFoundChannel(res);
        }
      });
    }
  )

  .post(
    //등록
    [
      body("userId")
        .notEmpty()
        .isInt()
        .withMessage("userId는 숫자여야 합니다."), // 이것의 뜻은 userId값이 없으면 안되고, 숫자여야 하며, 1,2번을 지키지 않으면 '숫자를 입력하세요' 라는 문구를 전달해라 라는 뜻.
      body("name").notEmpty().isString().withMessage("문자 입력 필요"),
      validate,
    ],

    (req, res, next) => {
      const { name, userId } = req.body; // userId 는 안에서 사용하는 변수라서 그런거고, user_id 는 데이터베이스 컬럼 이라서 언더바_가 들어간거다.

      let sql = `INSERT INTO channels (name, user_id) VALUES (?, ?)`;
      let values = [name, userId];
      connection.query(sql, values, function (err, results) {
        if (err) {
          console.log(err);
          return res.status(400).end();
        }
        res.status(201).json(results);
      });
    }
  );

//채널 전체 조회

router
  .route("/:id")

  .put(
    [
      param("id").notEmpty().withMessage("채널id필요"),
      body("name").notEmpty().isString().withMessage("채널명 오류입니다."),
      validate,
    ],
    (req, res, next) => {
      let { id } = req.params; //파라미터 받을려고
      id = parseInt(id);

      let { name } = req.body;

      let sql = `UPDATE channels SET name =?
        WHERE id =? `;
      let values = [name, id];
      connection.query(sql, values, function (err, results) {
        if (err) {
          console.log(err);
          return res.status(400).end();
        }

        if (results.affectedRows == 0) {
          console.log("없는 id값입니다.");
          return res.status(400).end();
        } else {
          res.status(200).json(results);
        }

        res.status(200).json(results);
      });
    }
  )

  //채널 개별 수정

  .delete(
    [param("id").notEmpty().isInt().withMessage("채널id필요"), validate],
    (req, res, next) => {
      let { id } = req.params;
      id = parseInt(id);

      let sql = `DELETE FROM channels WHERE id = ?`;
      connection.query(sql, id, function (err, results) {
        if (err) {
          console.log(err);
          return res.status(400).end();
        }
        if (results.affectedRows == 0) {
          console.log("없는 id값입니다.");
          return res.status(400).end();
        } else {
          res.status(200).json(results);
        }
      });
    }
  )

  //채널 개별 삭제

  .get(
    [param("id").notEmpty().withMessage("채널id 필요"), validate],
    (req, res, next) => {
      let { id } = req.params;
      id = parseInt(id);

      const sql = `SELECT * FROM channels WHERE id = ?`;
      connection.query(sql, id, function (err, results) {
        if (err) {
          console.log(err);
          return res.status(400).end();
        }

        if (results.length) {
          res.status(200).json(results);
        } else {
          notFoundChannel(res);
        }
      });
    }
  );

function notFoundChannel(res) {
  res.status(404).json({
    message: "채널 정보가 없습니다.",
  });
}

module.exports = router;
profile
Dive Head First | Work Super Hard | Attract Great People

0개의 댓글