✏️ 작성자: 김시연
📌 작성자의 한마디: custom 안하고는 머 할수가 없네여..
npm i express-validator
express-validator 에서 제공하는 내장함수를 이용하는 방법부터 알아봅시다.
** 더 많은 함수는 https://github.com/validatorjs/validator.js
body("필드","에러메시지").검증 api.검증 api
세미나에서 다루었던 방식입니다. Request Body 안 특정 필드에 대하여 검증할 수 있습니다. '.'으로 계속 chain해서 달 수 있습니다.
// 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
);
check("필드").if().검증 api.검증 api_
Body 에 특정 필드가 있을 경우에만 검증하고 싶을 때가 있겠죠. 그럴 땐 check().if()로 해결할 수 있습니다.
// 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을 커스텀해봅시다.
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
);
더 많은 예시를 확인하고 싶다면 위 링크를 참고해주세요!