유효성 검사(validation)
사용자가 입력한 값의 유효성
예시를 들어보자.
userId: 값이 있어야하고 숫자여야한다.
사람 name: 숫자X,문자열, 2자 이상
Express에서는 외부모듈인 "express-validator"를 사용한다.
https://www.npmjs.com/package/express-validator
채널 생성에 유효성 검사 적용
const {body, validationResult} = require('express-validator')
/**
*
* 중간 생략
*/
.post(
[body('userId').notEmpty().isInt().withMessage('숫자 입력 필요'),
body('name').notEmpty().isString().withMessage('문자 입력 필요')]
,(req,res) =>{
const err = validationResult(req)
if(!err.isEmpty()){
return res.status(400).json(err.array())
}
let {name, userId} = req.body
let sql = `INSERT INTO channels (name, user_id) VALUES (?, ?)`
let values = [name, userId]
conn.query(sql, values,
function(err, results) {
if(err)
return res.status(400).end();
res.status(201).json(results)
}
)
}) //채널 개별 생성
express-validator를 이용하여 유효성 검사를 해보았다. 먼저 body라는 위에서 받아온 함수를 post의 인자로 넣어준다.
body에는 가져올 값의 키를 넣고 여러가지 설정을 해준다. userId에는 값이 있어야하고 정수여야한다는 조건을 걸었고, name에는 값이 있어야 하고 문자열이어야 한다는 조건을 걸었다. 그 후 메시지 값도 설정해주었다.
사용하는 방법은 변수에 validationResult(req)를 통해 에러 정보를 담아오고 만약 에러정보가 있다면 예외처리를 하는 방향으로 하였다.
만약 에러정보가 있다면 err.array()를 통해 에러 정보를 400 에러와 함께 전달한다. res 문이 두개 있으면 문제가 될 수 있지만 return 문과 함께 사용하면 바로 함수가 종료된다.
데이터베이스에서 연산이 실패할 경우 err 메시지를 통해 400 코드를 내려줄 수 있다.
채널 개별 수정 유효성 검사 적용
const {body, param, validationResult} = require('express-validator')
/**
*
* 중간 생략
*/
.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]
conn.query(sql, values,
function(err, results) {
if(err) {
console.log(err)
return res.status(400).end()
}
if(results.affectedRows == 0){
return res.status(400).end()
} else {
res.status(200).json(results)
}
})
})//채널 개별 수정
마찬가지의 코드이고 이번엔 url을 가져오기 위해 param이라는 변수를 선언했다.
update, delete는 연산이 실패해도 result로 값이 반환되므로 affectedRows의 크기를 보고 예외처리를 해주었다.
검사 미들웨어 분리
const validate = (req, res, next) => {
const err = validationResult(req)
if(err.isEmpty()){
return next(); // 다음 할 일 (미들웨어, 함수)
} else {
return res.status(400).json(err.array())
}
}
.get(
[body('userId').notEmpty().isInt().withMessage('숫자 입력 필요'),
validate
]
,(req,res, next) =>{
let {userId} = req.body
let sql = `SELECT * FROM channels WHERE user_id = ?`
conn.query(sql, userId,
function(err, results) {
if(err){
return res.status(400).end();
}
if(results.length)
res.status(200).json(results)
else
notFoundChannel(res)
})
})
사실 매개변수의 첫번째 자리는 콜백함수가 불리기 전에 해야할 것들을 넣는 자리이다. 이 자리에 검증기를 미들웨어로 만들어서 넣을 수 있다. 단 next라는 변수를 하나 더 입력해야 정상작동한다. next를 실행하면 다음 할 일로 넘어가게 해준다.
후기
유효성검사에 대해 전반적으로 학습하였다. 그 후 반복되는 코드를 제거하기 위해 검사기를 미들웨어로 분리하는 방법에 대해서도 학습하였다.
키워드: 프로그래머스 데브코스, 국비지원교육, 코딩부트캠프
'프로그래머스 풀스택 데브코스 > 데브코스 TIL' 카테고리의 다른 글
웹 풀사이클 데브코스 TIL 28일차 (0) | 2023.12.26 |
---|---|
웹 풀사이클 데브코스 TIL 27일차 (0) | 2023.12.26 |
웹 풀사이클 데브코스 TIL 25일차 (0) | 2023.12.21 |
웹 풀사이클 데브코스 TIL 24일차 (0) | 2023.12.20 |
웹 풀사이클 데브코스 TIL 23일차 (0) | 2023.12.19 |