전에 코드를 올려둔 것 처럼하니,
포스트맨에서 값을 불러오지 못하고 계속 값을 찾는 오류가 생겼었다.
그래서 그 문제를 해결하기 위해 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;