유효성검사는 클라이언트가 body에 담아 보내는 데이터가 유효한지 확인하는 과정이다.
데이터베이스에서도 유효성검사가 이루어지지만 서버에서 유효성검사를 빨리 처리해서 비용을 줄이는 것이 좋다.
클라이언트에서도 유효성검사가 가능하지만 이것은 옵션으로 보는 면이 크다.
cli에 프로젝트 폴더라 이동한 뒤 npm i express-vaildator
를 입력해준다.
요청의 body에 express-validator의 API를 사용하면 validatoinResult(req)
로 오류상태를 받을 수 있다.
이것이 빈 상태라면 오류가 없다는 것이고 그렇지 않으면 오류가 발생했다는 것이다.
body
뿐만 아니라 param, 쿠키, 헤더 등에 유효성 검사를 진행할 수 있고
check
를 사용하면 요청온 모든 것에 해당하는 필드가 있다면 그것의 유효성을 검사할 수도 있다.
모든 미들웨어에 핸들러가 반복 작성되면 좋지 못한 코드가 되므로 이것을 함수로 생성해서 추가해주면 깨끗해질 것이다.
import { validationResult } from "express-validator";
export const validate = (req, res, next) => {
const errors = validationResult(req);
if (errors.isEmpty()) return next();
console.log(errors);
return res.status(400).json({ message: "validation error" });
};
const router = express.Router();
const validateAuth = [
body("email").isEmail(),
body("name").notEmpty(),
body("password").notEmpty().isLength({ min: 6 }),
validate,
];
router.post("/signup", validateAuth, authController.signup);
validate
함수를 생성하고 각 미들웨어에서 유효성검증을 한 후 끝에 validate
함수를 추가해주면 미들웨어에 따로 핸들러 함수를 생성하지 않아도 된다.
유효성 검증 전에 데이터를 소독(?)해줘야 한다.
sanitization은 데이터가 일관성있게 저장될 수 있도록 정리해주는 개념으로 생각하면 된다.
예를 들어 이름에 스페이스가 들어가있는데도 create가 되는 오류를 해결해줘야 한다.
유효성 검증 전에 trim을 사용해주면 데이터의 공백을 지워준다.
https://express-validator.github.io/docs/sanitization-chain-api.html
이곳에서 express-validator
의 sanitization API를 확인할 수 있다.
toDate()
API는 데이트 포맷으로 변경해주는 데 유용할 것 같다.