728x90
반응형

express-validator는 express에서 유효성 검사를 제공하는 미들웨어다.

POST API를 개발할 때, body값의 유효성 검증은 필수적이다. express-validator는 notEmpty, isIn, isLength 와 같이 빈값, 길이, 정규식 체크 등 간편하고 직관적으로 검증할 수 있는 기능을 제공해서 프로젝트에 적용하고자 한다.

 

유효성 검증하기

유효성을 검증하기위해 express-validator에서 제공하는 함수는 body, check 등이 있는데 대표적인 이 둘의 차이는 다음과 같다.

check : 검증과 확인이 실패했을때 에러메시지를 따로 설정할 수 있다.

body : 검증만 한다. 

check('password', "Password is required").notEmpty();
body('password').notEmpty();

위와 같이 check와 body는 인자가 다르지만, check, body 둘다 메시지를 설정하기 위해 withMessage를 하는 방법도 있다. 둘 중 무엇을 사용하느냐는 취향차이고 에러메시지를 따로 설정하지 않아도 기본적으로 "Invalid value"로 설정되어있기 때문에 메시지 설정이 필수는 아니다.

다만, check의 두번째 인자인 error message는 선택 사항이라 error message를 입력하지 않아도 body와 동일하게 사용할 수 있기때문에 나는 check를 더 편하게 사용할 것 같다!


아래는 기존 라우터에 express-validator를 적용하는 방법이다. 전후 비교는 게시물 하단에 있다.

1. 설치 : Node.js 버전이 8 인지 확인 후 설치한다

npm install --save express-validator

 

2. 선언을 라우터에 추가한다

const { body, validationResult } = require('express-validator');

 

3. 에러 노출을 위한 미들웨어 추가

const validator = (req, res, next) => {
    const errors = validationResult(req);
    if (errors.isEmpty()) {
        return next();
    }
    return res.status(400).json({ message: errors.array()[0].msg });
};

 

4. 라우터 두번째 인자에 검증 추가

// body 를 사용할 경우
_router.post('/', [body('type').notEmpty().withMessage('Type is required'), validator], ctrl.createReservation);

// check 를 사용할 경우
_router.post('/', [check('type', 'Type is required').notEmpty(), validator], ctrl.createReservation);

 

적용 전

const { isLoggedIn, isNotLoggedIn } = require('../middlewares/auth');
const ctrl = require('../controllers/reservation');

_router.post('/create', isLoggedIn, ctrl.createReservation);

module.exports = _router;

적용 후

const { isLoggedIn, isNotLoggedIn } = require('../middlewares/auth');
const { check, body, validationResult } = require('express-validator');

// 검증 미들웨어
const validator = (req, res, next) => {
    const errors = validationResult(req);
    if (errors.isEmpty()) {
        return next();
    }
    return res.status(400).json({ message: errors.array()[0].msg });
};
const ctrl = require('../controllers/reservation');

// 예약 추가
_router.post('/', [
        isLoggedIn,
        check('type')
            .notEmpty()
            .withMessage('Type is required')
            .isIn(['MT', 'PT'])
            .withMessage('Type must be MT or PT.'),
        check('duration', 'Duration is required').notEmpty(),
        check('proposed_start1', 'More than one proposed reservation time is required').notEmpty(),
        validator,
    ],
    ctrl.createReservation,
);
728x90
반응형

+ 최근 게시글