[Node.js] express-validator에서 custom() 이용하기

Server The SOPT·2022년 7월 16일
1

Node.js

목록 보기
1/1

✏️ 작성자: 김시연
📌 작성자의 한마디: custom 안하고는 머 할수가 없네여..

express-validator 로 request body 검증 custom 하기

설치

npm i express-validator

내장 함수 이용해 검증하기

express-validator 에서 제공하는 내장함수를 이용하는 방법부터 알아봅시다.

내장 함수

  • trim() : 공백을 제거해줍니다.
  • isLength(num) : 길이가 num인지 확인해줍니다. { min: num, max: num } 과 같이 최소, 최대 값도 지정할 수 있습니다.
  • bail() : 해당 부분에서 에러가 발생하면 다음으로 넘어가지 않습니다.
  • isNumeric() : 숫자 형태이지 확인한다. string이어도 해당 string이 숫자인지 확인해줍니다.
  • isEmail() : string이 이메일 형태인지 확인해줍니다.
  • isJSON() : string이 유효한 JSON인지 확인해줍니다. JSON.parse를 사용한다고 합니다.
  • isMobilePhone() : string이 모바일 휴대폰 번호인지 확인해줍니다.

** 더 많은 함수는 https://github.com/validatorjs/validator.js

방식(1)

body("필드","에러메시지").검증 api.검증 api

세미나에서 다루었던 방식입니다. Request Body 안 특정 필드에 대하여 검증할 수 있습니다. '.'으로 계속 chain해서 달 수 있습니다.

예시(1)

// RecordRouter.ts

import { body } from 'express-validator/check';

const router: Router = Router();
router.post(
  '/',
  [
    body('title').exists()
    body('content').notEmpty()
    body('email','이메일란을 확인해주세요!').isEmail().notEmpty()
    body('password').isLength({ min: 5, max:20 })
  ],
  RecordController.createRecord
);



방식(2)

check("필드").if().검증 api.검증 api_

Body 에 특정 필드가 있을 경우에만 검증하고 싶을 때가 있겠죠. 그럴 땐 check().if()로 해결할 수 있습니다.

예시(2)

// RecordRouter.ts

import { check } from 'express-validator/check';

const router: Router = Router();
router.patch(
  '/:recordId',
  [
    check('title').if(body('title').exists()).trim().notEmpty(),
  ],
  RecordController.updateRecord
);



Validation Custom 하기

내가 원하는 validation을 커스텀해봅시다.

방식

body("필드").custom((value, {req}) => {
    if(검증 조건 불만족) {return false;}
   return true;
})

예시

예시(1)에서는 Request Body 속 title 필드가 공백을 제외하고 1~25자 인 것을 확인합니다. title이 있는 경우에만 확인하므로 check().if()를 달고 그 뒤에 custom을 달면 됩니다.

예시(2)에서는 Request Body 속 다른 필드와의 일치를 확인해야 하기 때문에 {req}로 request를 같이 받아옵니다. Error를 직접 throw 할 수도 있습니다.

// RecordRouter.ts

import { check } from 'express-validator/check';

const router: Router = Router();
router.patch(
  '/:recordId',
  [
  	//(1) title 필드가 공백 제외 1~25자 인 것 확인.
    check('title').if(body('title').exists())
      	.custom((title) => 
        {
        	if (title.toString().replace(/(\s*)/g, '').length > 25 || title.toString().replace(/(\s*)/g, '').length < 1) {
          		return false;
        	}
        	return true;
      	}).withMessage('제목 오류'),
    
    //(2) password 확인 필드가 password 필드와 같은 것 확인.
    body('confirm')
      .custom((value, {req}) => {
       if (value !== req.body.password) {
        throw new Error('Password must be symbols')
       }
       return true
      })
  ],
  RecordController.updateRecord
);

더 많은 custom 예시

더 많은 예시를 확인하고 싶다면 위 링크를 참고해주세요!

profile
대학생연합 IT벤처창업 동아리 SOPT 30기 SERVER 파트 기술 블로그입니다.

0개의 댓글