반응형

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/

 

Getting Started · express-validator

express-validator is a set of [express.js](http://expressjs.com/) middlewares that wraps

express-validator.github.io

 

 

읽어주셔서 감사합니다.

 

 

 

반응형

+ Recent posts