서론

Spring-boot를 공부하던 중 Bean Validation에서 제공하는 annotation을 사용해보니 코드가 너무 간결해지고 관리가 편하다는 것을 느꼈다. 그래서 node express에서도 요청 값을 validation 할 수 있는 라이브러리를 찾다가 알게 된 express-validator에 대한 설명글을 쓰고자 한다.

유효성 검사를 좀 더 간편하게!

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

app.post(
  '/user',
  body('username').isEmail(),
  body('password').isLength({ min: 5 }),
  (req, res) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return res.status(400).json({ errors: errors.array() });
    }

    User.create({
      username: req.body.username,
      password: req.body.password,
    }).then(user => res.json(user));
  }
);

 

위 코드는 Getting started에서 나오는 예제이다. 간단하게 Router에서 유효성을 검사할 수 있다. 요청 핸들러 전에 유효성을 추가한 뒤 요청 핸들러에서 validationResult 객체를 통해 에러를 확인하고 에러를 처리해주는 형태로 사용한다. 하지만 모든 router에 유효성 검사 코드를 추가하고 요청 핸들러에 validationResult 객체를 이용한 에러코드 처리 부분까지 다 추가하기에는 하드코딩의 느낌이 들기에 에러 처리 부분을 미들웨어로 빼도록 구현해보고자 한다.

미들웨어로 구현

/* ~/middleware/validator.js */
const { validationResult } = require("express-validator");

exports.validatorErrorChecker = (req, res, next) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(400).json({ errors: errors.array() });
  }
  next();
}

 

const { body } = require('express-validator');
const { validatorErrorChecker } = require('../middleware/validator');

router.post('/login', [
  body('email').exists().isEmail(),
  body('password').exists().isLength({ min: 10, max: 20 }),
  body('type').exists().isIn(['user', 'admin']),
  validatorErrorCallback
], (req, res) => {

  const email = req.body.email;
  const password = req.body.password;
  const type = req.body.type;

  res.json({
    email,
    password,
    type
  });
});

구현한 미들웨어를 불러와 유효성 검증 마지막에 넣어준다. 만약 에러가 있다면 분기를 가로채 400 에러를 반환하고 에러가 없다면 next()가 호출돼 정상적인 요청 핸들링이 가능하다.

테스트

비밀번호 길이가 최소 10이상
type이 user 또는 admin 만 가능
정상 흐름