[Node.js] 유효성 검사(Validation), express-validator 사용법
validation 설치 방법:
npm install express-validator
//타입스크립트의 경우 추가 설치
npm install @types/validator
Validation
express-validator는 다양한 요청 데이터에 대한 유효성 검사를 제공한다.
- check
- body
- param
- query
- headers
더보기: 위 다섯 가지 유효성 검사에 대한 설명
1. check
: 가장 일반적인 유효성 검사 함수이다. 이 메소드는 요청 객체의 어떤 부분이든 검사할 수 있다.
2. body
: HTTP 요청의 body 부분에서만 작동한다. 요청된 바디에 text가 있고, text에 대한 유효성을 검사하고 싶으면 body('text')를 사용하면 된다.
3. param
: url의 경로 매개변수를 검사하는 데 사용된다. 예를 들어, /user/:id와 같은 url에서 id 매개변수의 유효성 검사를 하려면 param('id')를 사용하면 된다.
4. query
: url의 특정 쿼리 문자열에서 유효성 검사를 한다. 예를 들어, /search?query=something의 query 유효성 검사를 진행하고 싶다면, query('query')를 사용하면 된다.
5. header
: 이 메소드는 헤더에서 유효성 검사를 한다. 예를 들어, 컨텐츠 유형, 인증 정보 등을 포함할 수 있다. header('Authorization')은 Authorization에 대한 유효성 검사를 한다.
Validator사용법
post('경로', 유효성 검사 코드, (req, res) => {콜백내용} )
유효성 검사는 위에 코드처럼 위치하고, 배열 [ ] 형태로 여러 개의 유효성 검사를 진행할 수 있다.
const { check, validationResult } = require('express-validator');
router.post('/user', [
// username은 이메일이어야 한다.
check('username').isEmail(),
// 비밀번호는 5글자 이상이어야 한다.
check('password').isLength({ min: 5 })
], (req, res) => {
...동작코드
});
이 코드에서 유효성 검사를 통과하지 못하면, 그 에러를 처리하는 코드는 다음과 같다.
function validate(req, res, next) {
const errors = validationResult(req);
// 만약 errors가 비어있지 않다면 (errors에 err가 존재한다면)
if (!errors.isEmpty()) {
// 첫 번째 에러를 firstError 변수에 할당
const firstError = errors.array()[0]
// firstError의 msg 프로퍼티를 json으로 보내줌
return res.status(400).json(firstError.msg);
} else {
// 문제가 없다면 계속 진행
next();
}
}
⚠️참고사항
발생한 에러들은 errors 변수에 담고, .array()는 errors에 있는 에러 객체들을 배열 형태로 반환해 주는 역할을 한다.
유효성 검사 에러 처리 코드는 middleware 디렉토리 혹은 원하는 곳에 위치하여, 유효성 검사 코드 마지막에서 함수를 호출해 준다.
Sanitization
Sanitization의 사전적 의미는 '소독'이지만, 여기서는 '입력값 정제' 정도로 해석하면 된다.
어떤 느낌인지는 공부하면서 아는 게 좋을 듯하다.
사용법은 유효성 검사와 같다.
더보기: Sanitization과 유효성 검사와 유효성 검사 순서와 이유
일반적으로는 sanitize(정제)를 먼저 하고 validation(유효성 검사)을 한다.
이유는 다음과 같다.
: 예를 들어, 유효성 검사에서 toLength(최소or최대 길이 설정)로 최소 길이 2로 설정했다고 가정하자.
만약 sanitize를 먼저 하지 않는다면, ' '(스페이스 3개)라는 데이터가 들어오면 유효성 검사를 통과해 버린다.
이런 경우를 사전에 방지할 수 있다. trim()을 먼저 사용하여 공백을 제거하고 유효성 검사를 해야 한다. (유효성 검사 통과 실패)
예외 상황도 있다.
: 예를 들어, 이메일 주소를 normalize 하는 경우, 입력값이 실제로 유효한 이메일 주소인지 먼저 확인 후에 normalize를 하는 것이 더 좋을 수 있다.
trim()과 normalizeEmail()에 대해서는 더보기 밖에 다음 문장에서 설명할 것이다.
trim(): 문자열 앞 뒤의 공백을 제거해 준다. (⛔️주의: 실제 값까지 영향을 준다.)
check('username').trim()
normalizeEmail(): 이메일 주소를 표준 형식으로 변환해 준다.(Google, Outlook, Yahoo, icloud에 대해서만 세부적, 나머지는 대문자->소문자)
check('email').normalizeEmail()
더보기: normalizeEmail()은 Google, Outlook, Yahoo, iCloud에 대해서 다음과 같은 변환을 수행한다.
- 모든 이메일을 소문자로 변환한다 (모든 이메일 동일)
- Google 주소 정규화(local part(이메일 앞 부분)에서 모든 점 제거, local part에서 '+' 기호 제거)
- Outlook 주소 정규화
- Yahoo 주소 정규화
- iCloud 주소 정규화

toInt(), toFloat(): 값을 정수나 실수로 변환한다.
check('age').toInt()
toDate(): Javascript Date 객체로 변환한다.
check('birthday').toDate()
⚠️이 외에 나머지는 나중에 유용한 거 발견 시 작성할 예정
'BE > NodeJS' 카테고리의 다른 글
[Node.js] mysql, Sequelize 모델 정의, 메소드 사용 방법 (0) | 2023.06.01 |
---|---|
[Node.js] bcrypt와 jwt 이해 및 사용법 (0) | 2023.05.29 |
[Node] findOne 메소드와 조건추가 이해하기 (0) | 2023.05.15 |
[Node] findAll 메소드 활용하여 Database 조회하기 (0) | 2023.05.15 |
[Node] mySQL과 Sequelize를 이용한 데이터베이스 설정 (0) | 2023.05.14 |