[Node.js] express-validator (유효성 검사)
JavaScript & TypeScript

[Node.js] express-validator (유효성 검사)

반응형

유효성 검사는 클라이언트에서 서버로 요청을 보낼 때, 정확한 데이터를 보내고 있는 것인지 확인하는 것입니다.

서버에서 유효성검사를 최대한 빨리하는 것이 좋습니다. 왜냐하면 서버에서 데이터를 읽는 것도 비용이기 때문에 필수적입니다.

그렇기 때문에 서버에서 라우터-컨트롤러로 진행이 되기에 유효성검사는 라우터 부분에서 하는 것이 좋고, 또한 컨트롤러는 기능수행의 역할을 하기에 유효성검사를 같이 하기엔 적합하지 않다고 생각합니다.

 

보통 유효성 검사를 하게 되면 조건문을 사용하여 유효성 검사를 하게되는데 validator 라이브러리를 사용하면 좀 더 쉽고 보기 좋게 유효성 검사를 할 수 있습니다.

npm install --save express-validator

 

 

공식문서에서는 아래의 코드처럼 간단하게 설명하고 있습니다.

POST user 로 보냈을 때 body에 username의 값을 이메일인지 아닌지 검사를 하는 것입니다.

password는 5글자 보다 작은지 검사하고 그렇지 않을 경우 에러를 반환합니다.

// ...rest of the initial code omitted for simplicity.
const { body, validationResult } = require('express-validator');

app.post(
  '/user',
  // username must be an email
  body('username').isEmail(),
  // password must be at least 5 chars long
  body('password').isLength({ min: 5 }),
  (req, res) => {
    // Finds the validation errors in this request and wraps them in an object with handy functions
    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));
  },
);

반환하는 에러는 아래와 같습니다.

{
  "errors": [
    {
      "location": "body",
      "msg": "Invalid value",
      "param": "username"
    }
  ]
}

 

 

공식문서에 설명이 잘되어있는데 body 뿐만아니라 cookie, header, param, query 전부 확인이 가능하고 check를 사용하여 넓은 범위로 검사가 가능합니다. 

withMessage를 통해 에러 메세제를 제어할 수 있고,

notEmpty를 통해 값이 비어있는지 확인도 가능합니다.

 

그리고 공식문서에서는 Sanitization으로 표현을 하는데 살균이라는 뜻입니다.

예를 들어 사용자가 이메일 사이에 빈칸을 입력했을 때 오류가 떠야 정상이지만

trim 메서드를 사용하여 빈 칸을 모두 삭제 후, 검사를 할 수 있습니다.

 

 

저는 아래 코드와 같이 구현해봤고 에러 코드는 자주 반복해서 사용해야하기 때문에 미들웨어로 변경하고, 에러메세지만 나오도록 코드를 짜봤습니다.

자세한 내용은 공식문서가 생각보다 잘 설명되어있는 것 같아 공식문서를 확인하는 편이 더 좋을 것 같습니다.

 

router

const { body, header, query } = require("express-validator");
const { validateError } = require("../middleware/vaildator");

 

router.post(
  "/login",
  [
    body("email").isEmail().withMessage("이메일을 입력해주세요"),
    body("password")
      .notEmpty()
      .withMessage("비밀번호를 입력해주세요")
      .isLength({ min: 8, max: 16 })
      .withMessage("8~16자리 비밀번호를 입력해주세요"),
    validateError,
  ],
  usersController.login,
);

middleware

const { validationResult } = require("express-validator");

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

 

 

 

 

공식문서

https://express-validator.github.io/docs/

 

유효성 검사 옵션

https://github.com/validatorjs/validator.js#validators

Sanitization 옵션

https://github.com/validatorjs/validator.js#sanitizers

 

 

 

 

반응형

'JavaScript & TypeScript' 카테고리의 다른 글

[JS] CommonJS와 ES6  (0) 2022.02.13
[JS] 반복문에 promise  (0) 2022.02.07
[Node.js] Console 종류  (0) 2021.08.05
[Node.js] 특징  (0) 2021.08.04
[JS] method 정리  (0) 2021.07.25