Validation 유효성 Sanitization

📌 유효성

데이터베이스에 접근하는 경우 네트워크 비용이 발생할 수 있다. 때문에 데이터베이스를 접근하기 전 데이터가 유효한지 검사할 필요가 있고, 또한 sanitization을 통해 일관성있는 저장을 할 수 있다.

npm i express-validator

express validator github

📌 express-validator 사용

request

{
    "name":"a",
    "age":1,
    "job": {
        "name" : "DC academy",
        "title" : "instructor"
    },
    "email" : "[email protected]"
}

express example

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

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

app.post(
  '/users',
  body('name')     //<<<--- name validation
    .isLength({ min: 2, max: 10 })
    .withMessage('이름은 두글자 이상이야'), 
  body('age')      //<<<--- age validation
    .notEmpty()
    .isInt()
    .withMessage('숫자를 입력해'), 
  body('job.name') //<<<--- job.name validation
    .notEmpty()
    .isLength({ min: 2 })
    .withMessage('두글자 이상 입력해'),
  (req, res, next) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return res.status(400).json({ message: errors.array() });
    }
    console.log(req.body);
    res.sendStatus(201);
  }
);

app.get(
  '/:email',
  param('email')  // <<<--- param을 검사
    .isEmail()
    .withMessage('이메일 입력해'),
  (req, res, next) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return res.status(400).json({ message: errors.array() });
    }
    res.send('good');
  }
);

app.listen(8080);

📎 chaining

body('name')
  .notEmpty()
  .withMessage('이름을 입력해')
  .isLength({min:2})
  .withMessage('두글자 이상')
  • 이름은 비어있지 않아야 하고,
  • 비어 있다면 error메시지('이름을 입력해')
  • 이름은 두글자 이상이어야 하고,
  • 두글자 이상이 아니라면 error 메시지('두글자 이상')

📎 example 리팩토링

validate 함수를 작성하여 처리해준다.

const validate = (req, res, next) => {
  const errors = validationResult(req);
  if (errors.isEmpty()) {
    return next();
  }
  return res.status(400).json({ message: errors.array()[0] }); //<<-- 첫번째 메시지만 보내주고 싶을 경우
};

app.post(
  '/users',
  body('name')
    .notEmpty()
    .withMessage('이름을 입력해')
    .isLength({ min: 2 })
    .withMessage('두글자 이상'),
  body('age').notEmpty().isInt().withMessage('숫자를 입력해'),
  body('job.name') //<<<--- age validation
    .notEmpty()
    .isLength({ min: 2 })
    .withMessage('숫자를 입력해'),
  validate,        //<<<--- validate 함수 추가
  (req, res, next) => {
    console.log(req.body);
    res.sendStatus(201);
  }
);

app.get(
  '/:email',
  param('email').isEmail().withMessage('이메일 입력해'),
  validate,       //<<<--- validate 함수 추가
  (req, res, next) => {
    res.send('good');
  }
);

📌 Sanitization

유효성 검사를 하는 경우 사용자에게서 받은 데이터에 대해 sanitization을 해주어야 한다.
예를 들면, 이름을 " j h o n "과 같이 띄어쓰기를 같이 쓰는 등의 유효하지 않게 작성한 경우를 처리해주어야 한다.

app.post(
  '/users',
  [
    body('name').trim().isLength({ min: 2 }).withMessage('두글자 이상'), 
    //<<<--- 띄어쓰기 trim
    body('age').notEmpty().isInt().withMessage('숫자를 입력해'),
    body('email').isEmail().withMessage('email 입력하세요')
      .normalizeEmail(),    //<<--- 이메일 대문자를 소문자로 변경
  ],
  (req, res, next) => {
    console.log(req.body);
    res.sendStatus(201);
  }
);

Contract Testing : Client-Server

contract test 설명

좋은 웹페이지 즐겨찾기