유효성 검사

데브코스

목록 보기
48/131

유효성 검사

한 데이터가 글자만 들어왔는지, 숫자가 없는지, 숫자로 지정해뒀다면 문자가 들어오지 않고 숫자만 잘 들어왔는지. 등 유효성에 대한 검사를 해주는 것이 중요하다.


validation

"사용자가 입력한 값" 유효성(=타당성)을 확인하는 것

ex)
userId : 값이 있어야 함, 숫자여야 함

사람 name : 숫자는 x, 문자열 2자 이상

이런게 유효성 검사라는 거야.


그래서 이런 유효성 검사를 쉽게 해주는 친구를 하나 사용할 것인데,

그게 무엇이냐면,

외부 모듈 "express-validator" 라는 친구야.


이제 코드로 돌아와서

const { body, validationResult } = require("express-validator");

이걸 적어주고

post(body("userId").notEmpty().isInt(), (req, res) => {
    const err = validationResult(req);

    if (!err.isEmpty()) {
      console.log("err 발생! userId가 유효성 검사에 통과하지 못했습니다.");
    }

이렇게 추가해줘. body에서 userId가 비워져있는지 확인하고, 정수인지 확인 하는 것들이야.


이거 코드 천천히 읽어보면 돼. 어렵지 않음.

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) => {
  //이렇게하면 하나의 미들웨어 방식으로 사용할 수 있어.
  const err = validationResult(req);

  if (!err.isEmpty()) {
    return res.status(400).json(err.array());
  }
};

//채널 개별 생성
router

  .route("/")
  .get(
    //조회
    [body("userId").notEmpty().isInt().withMessage("숫자입력필요"), validate], //이렇게 사용해서 유효성 검사를 하고 에러가 난다면 바로 보여줄 수 있도록 함.
    (req, res) => {
      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는 숫자여야 합니다."),
      body("name").notEmpty().isString().withMessage("문자 입력 필요"),
    ],

    (req, res) => {
      const err = validationResult(req);

      if (!err.isEmpty()) {
        return res.status(400).json(err.array());
      }

      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("채널명 오류입니다."),
    ],
    (req, res) => {
      const err = validationResult(req);

      if (!err.isEmpty()) {
        return res.status(400).json(err.array());
      }

      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필요"),

    (req, res) => {
      const err = validationResult(req);

      if (!err.isEmpty()) {
        return res.status(400).json(err.array());
      }

      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 필요"),

    (req, res) => {
      const err = validationResult(req);

      if (!err.isEmpty()) {
        return res.status(400).json(err.array());
      }

      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개의 댓글