express-validator를 사용하여 요청의 유효성 검사하기

younoah·2022년 2월 2일
0

[nodeJS]

목록 보기
13/15

validation 유효성 검사

사용자의 요청이 유효한지 검사하는 것은 꽤나 까다롭다.

요청마다 일일이 body, params를 검사해서 에러 처리해야하기 때문이다.

하지만 express-validator 라는 라이브러리를 사용하면 유효성 검사를 쉽게 할 수 있다.

express-validator 공식 문서

Sanitization이란?

유효성 검사를 하기전에 데이터를 정제해주어야 한다.

예를들어 공백을 처리해주는 것이 대표적인 예시이다.

기본 사용법

import express from 'express';
import { body, param, validationResult } from 'express-validator';

const app = express();
app.use(express.json());

// body 유효성 검사
app.post(
  '/users',
  body('name')
  	.trim()
    .notEmpty()
    .withMessage('공백 안돼!')
    .isLength({ min: 2, max: 8 })
    .withMessage('이름은 2~8글자'),
  (req, res) => {
    const errors = validationResult(req);

    if (!errors.isEmpty()) {
      return res.status(400).json({ message: errors.array() });
    }

    res.sendStatus(201);
  }
);

// 파라미터 유효성 검사
app.get(
  '/:email',
  param('email').isEmail().withMessage('이메일 입력해'),
  (req, res) => {
    const errors = validationResult(req);

    if (!errors.isEmpty()) {
      return res.status(400).json({ message: errors.array() });
    }
  }
);

app.listen(8000);
  • body 유효성 검사 : express-validatorbody 사용하여 sanitization과 유효성 검사를 진행한다.

  • 파라미터 유효성 검사 : express-validatorparam 사용하여 유효성 검사를 진행한다.

validationResult() 미들웨어를 통해 최종적으로 정의한 유효성 검사를 req에 적용한다.

validationResult() 의 반환값에서 isEmpty() 메서드를 활용하여 에러가 존재했는지 검사한 이후 array() 메서드로 유효성 검삭에 걸린 에러들을 배열형태로 반환받을 수 있다.

각 메서드들에 어떤 sanitizer 가 있는지 알고 싶으면 cmd + 클릭으로 정의부분을 확인해보자.


리팩토링

import express from 'express';
import { body, param, validationResult } from 'express-validator';

const app = express();
app.use(express.json());

// 검사 미들웨어 분리
const validate = (req, res, next) => {
  const errors = validationResult(req);
  if (errors.isEmpty()) {
    return next();
  }
  return res.status(400).json({ message: errors.array()[0].msg });
};

app.post(
  '/users',
  [
    body('name').trim().isLength({ min: 2 }).withMessage('이름은 두글자 이상!'),
    body('age').isInt().withMessage('숫자를 입력해!'),
    body('email').isEmail().withMessage('이메일 입력해!').normalizeEmail(),
    body('job.name').notEmpty(),
    validate,
  ],
  (req, res, next) => {
    console.log(req.body);
    res.sendStatus(201);
  }
);

app.get(
  '/:email',
  [param('email').isEmail().withMessage('이메일 입력해!'), validate],
  (req, res, next) => {
    res.send('success!');
  }
);

app.listen(8080);

validationResult 를 미들웨어로 분리하고 유효성 검사로직들을 배열형태의 미들웨어로 작성하면 훨씬 가독성이 좋아진다.

profile
console.log(noah(🍕 , 🍺)); // true

0개의 댓글