이는 회원가입 관련하여 유효성 검사하면 많이 본 모듈이다. 나는 이걸 회원가입하면서 많이 쓰지 않았고 db에 모델 구축할 때 쓴 validate로 인하여 쓰게 되었다.
express-validator
클라이언트가 서버에게 특정한 요청이나 리소스를 위해 바디로 보내는 데이터를 post 형식과 put형식등으로 보낼 때 요청이나 데이터들이 유효한지 확인하는 유효성 검사 모듈이다.
미들웨어 함수로도 사용할 수 있고, API 형태로 활용도 가능하다. validator.js를 활용해 편리하게 제작된 모듈이다.
npm i --save express-validator
사용하기 전에 미리 설치해줘야 한다.
유효성 검사 방법
const { check, validationResult } = require("express-validator");
require를 이용하여 express-validator를 사용한다. 검색을 해보니 거의 body를 가져와서 사용하는데, body, header,param,query등을 가져와 데이터의 유효성 검사를 한다. 내 경우에는 check를 사용해서 유효성 검사를 하였다. 이 check는 넓은 범위로 검사가 가능하다.
1) 라우터에서 유효성 검사
router.post(
"/",
[
check("name", "Name is required").not().isEmpty(),
check("email", "Please include a valid email").isEmail(),
// ...
);
위와 같은 코드의 경우 라우터에서 요청 핸들러 전에 유효성을 추가해준다.
router.post(
"/",
[
check("name", "Name is required").not().isEmpty(),
check("email", "Please include a valid email").isEmail()
]
async (req, res) => {
const errors = validationResult(req);
// ...
}
);
이를 요청 핸들러에서 validationResult 객체를 통해 에러를 확인하고 에러를 처리해주는 형태로 사용한다. validationResult는 request로 넘어오는 파라미터들을 check부분의 유효성을 검증한 후 에러가 발생하면 배열 형태로 반환한다.
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
이렇게 배열로 반환해주면 배열을 따로 뽑아서 프론트엔드에서 errors의 message를 alert창으로 보여주면 된다.
2) 미들웨어에서 유효성 검사
exports.validatorErrorChecker = (req, res, next) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
next();
}
미들웨어에서 구현하고 에러가 나면 어떻게 json형식으로 나타내줄 것인지 작성한다. 만약에 유효성 검사를 했는데 오류가 나면 error:[{value, msg, param, location}]값으로 나온다.
const { validatorErrorChecker } = require('../middleware/validator');
router.post('/login', [~
validatorErrorChecker
], (req, res) => {
~
}
이렇게 라우터에서 맨마지막에 적어 호출해준다.
Sanitization
TTP 요청에서 입력을 수신하는 것은 데이터가 올바른 형식인지 확인하는 것뿐만 아니라 노이즈가 없는지 확인한다. validator.js는 들어오는 데이터를 처리하는 데 사용할 수 있는 몇 가지 Sanitization를 제공해준다.
유용한 express-validator 함수들
- trim() : 공백을 제거해줍니다. 이는 Sanitization 중에 하나이다.
- isLength(num) : 길이가 num인지 확인해줍니다. { min: num, max: num } 과 같이 최소, 최대 값도 지정할 수 있습니다.
- bail() : 해당 부분에서 에러가 발생하면 다음으로 넘어가지 않습니다.
- isNumeric() : 숫자 형태이지 확인한다. string이어도 해당 string이 숫자인지 확인해줍니다.
- isEmail() : string이 이메일 형태인지 확인해줍니다.
- isJSON() : string이 유효한 JSON인지 확인해줍니다. JSON.parse를 사용한다고 합니다.
- isMobilePhone() : string이 모바일 휴대폰 번호인지 확인해줍니다.
아래의 사이트를 참고하여 작성하였습니다.