express-validator는 유효성 검사를 도와주는 npm 라이브러리이다.
본 포스팅을 통해 아래와 같은 유효성 검사 로직을 적용해보자.
비어있지 않음 - notEmpty()
email 형식 - isEmail()
date 형식 - isDate()
error message 변경 - withMessage()
또한 본 포스팅에서는
router에서 validation 로직을,
controller에서 error handling 로직을 작성할 것이다.
express-validator 설치
yarn add express-validator
// 또는
npm install express-validator
router 수정 (validation 부분)
// 적용 전
import { Router } from "express";
import { UserController } from "../controllers";
const router: Router = Router();
router.post('/', UserController.createUser);
// 적용 후
import { Router } from "express";
import { body } from "express-validator/check";
import { UserController } from "../controllers";
const router: Router = Router();
router.post('/', [
body("name")
.notEmpty().withMessage("name이 비어있습니다."),
body("phone")
.notEmpty().withMessage("phone이 비어있습니다."),
body("email")
.notEmpty().withMessage("email이 비어있습니다.")
.isEmail().withMessage("email 형식이 올바르지 않습니다."),
], UserController.createUser);
notEmpty() : 비어있으면 error 발생
메서드명이 대부분 직관적으로 이해된다.
withMessage는 바로 앞 메서드에 대해 error message를 변경해준다.
(default value는 'Invalid value'로 심플해서 웬만하면 수정하는 것이 좋다.)
// 적용 전
import express, { Router } from "express";
import { body } from "express-validator/check";
import MovieController from "../controllers/MovieController";
const router: express.Router = Router();
router.post('/', MovieController.createMovie);
export default router;
// 적용 후
import express, { Router } from "express";
import { body } from "express-validator/check";
import MovieController from "../controllers/MovieController";
const router: express.Router = Router();
router.post('/', [
body("title")
.notEmpty().withMessage('title이 비어있습니다.'),
body("director")
.notEmpty().withMessage('director가 비어있습니다.'),
body("startDate")
.isDate().withMessage('startDate의 형식이 올바르지 않습니다.'),
] ,MovieController.createMovie);
export default router;
isDate() : date 형식이 아니면 error 발생
이번에는 controller에서 error를 handling 해보자.
controller 수정 (error handling 로직)
// 적용 전
const createMovie = async (req: Request, res: Response): Promise<void | Response> => {
const movieCreateDto: MovieCreateDto = req.body;
try {
const data = await MovieService.createMovie(movieCreateDto);
res.status(statusCode.CREATED).send(util.success(statusCode.CREATED, message.CREATE_MOVIE_SUCCESS, data));
} catch (error) {
console.log(error);
res.status(statusCode.INTERNAL_SERVER_ERROR).send(util.fail(statusCode.INTERNAL_SERVER_ERROR, message.INTERNAL_SERVER_ERROR));
}
}
// 적용 후
// ...
import { validationResult } from "express-validator";
// ...
const createMovie = async (req: Request, res: Response): Promise<void | Response> => {
const error = validationResult(req); // validation 결과 받아오기
if (!error.isEmpty()) {
console.log(error);
return res.status(statusCode.BAD_REQUEST).send(util.fail(statusCode.BAD_REQUEST, error.array()[0].msg));
}
const movieCreateDto: MovieCreateDto = req.body;
try {
const data = await MovieService.createMovie(movieCreateDto);
res.status(statusCode.CREATED).send(util.success(statusCode.CREATED, message.CREATE_MOVIE_SUCCESS, data));
} catch (error) {
console.log(error);
res.status(statusCode.INTERNAL_SERVER_ERROR).send(util.fail(statusCode.INTERNAL_SERVER_ERROR, message.INTERNAL_SERVER_ERROR));
}
}
위와 같은 로직으로 error를 받아와 그 여부를 확인(!error.isEmpty())하고 (-> error가 있으면 isEmpty() 결과가 false가 나온다.)
'error.array()[0].msg' 로 그 msg를 받아온다.
참고로 error에 대한 여러 정보가 error.array()에 담겨 있는데, 아래와 같다.
// console.log(error) 결과
Result {
formatter: [Function: formatter],
errors: [
{
value: undefined,
msg: 'director가 비어있습니다.',
param: 'director',
location: 'body'
}
]
}
// console.log(error.array()) 결과
[
{
value: undefined,
msg: 'director가 비어있습니다.',
param: 'director',
location: 'body'
}
]
저 배열 값을 활용하려고 이것 저것 써봤는데..
답은 error.array() 였다!
그 외에도 많은 기능과 용법을 공식 문서에서 확인할 수 있다!
https://express-validator.github.io/docs/
읽어주셔서 감사합니다.