한 데이터가 글자만 들어왔는지, 숫자가 없는지, 숫자로 지정해뒀다면 문자가 들어오지 않고 숫자만 잘 들어왔는지. 등 유효성에 대한 검사를 해주는 것이 중요하다.
"사용자가 입력한 값" 유효성(=타당성)을 확인하는 것
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;