[Node.js] 유효성 검사: express-validatior
유효성 검사
유효성 검사란 사용자가 입력한 값이 유효한지를, 타당한지를 확인하는 검사이다.
예를들어 로그인을 진행한다면 사용자로부터 아이디와 비밀번호를 입력받아야 하고, 아이디와 비밀번호는 그 조건을 만족하는 문자열이어야 할 것이다.
express-validator
https://www.npmjs.com/package/express-validator
express-validator
Express middleware for the validator module.. Latest version: 7.2.1, last published: 2 months ago. Start using express-validator in your project by running `npm i express-validator`. There are 11693 other projects in the npm registry using express-validato
www.npmjs.com
만약 유효성 검사를 하나하나 작성해야 한다면 매우 피곤할 것이다.
친절하게도 express-validator라는 모듈은 이런 작업을 편리하게 할 수 있도록 만들어준다.
https://express-validator.github.io/docs/guides/getting-started
Getting Started | express-validator
One of the best ways to learn something is by example!
express-validator.github.io
자세한 사용 정보는 위 github io에서 확인 가능하다.
const {body, validationResult} = require('express-validator')
먼저 코드 상단에 express-validator를 사용하기 위해 require()문을 작성해준다.
.post(body("userId").notEmpty().isInt(), (req, res) => {
const result = validationResult(req);
if (!result.isEmpty()) {
console.log("userId가 유효성 검사를 통과하지 못했습니다.");
}
그리고 요청을 처리하는 코드에 query("userId").notEmpty().isInt() 를 추가해주고,
err = validationResult(req)로 유효성 검사 통과 여부를 저장하도록 하였다.
이상태로 userId에 이상한 값(abc)를 넣고 요청을 보내면 콘솔창에서 유효성 검사를 통과하지 못했다는 문구가 나온다.
.post(
body("userId").notEmpty().isInt().withMessage("숫자 입력 필요"),
(req, res) => {
const result = validationResult(req);
if (!result.isEmpty()) {
console.log("userId가 유효성 검사를 통과하지 못했습니다.");
console.log(result.array());
}
추가로 isInt() 뒤에 .withMessage()를 추가하여 에러 발생 시 출력되는 메시지를 설정할 수도 있다.
.post(
[
body("userId").notEmpty().isInt().withMessage("숫자 입력 필요"),
body("name").notEmpty().isString().withMessage("문자 입력 필요"),
],
(req, res) => {
const result = validationResult(req);
if (!result.isEmpty()) {
return res.status(400).json(result.array());
}
파라미터 여러 개를 유효성 검사를 진행하고 싶다면, 배열 [] 내에 여러 개를 넣으면 된다.
그리고 if문에 return res.status(400).json(err.array())를 통해 에러 발생 시 에러 메시지를 리턴하도록 하였다.
const { body, param, validationResult } = require("express-validator");
.get(param("id").notEmpty(), (req, res) => {
const result = validationResult(req);
만약 body가 아닌 parameter로 전달받은 값에 대하여 유효성 검사를 진행하고 싶다면,
위와 같이 body가 아닌 param으로 진행하면 된다.
유효성 검사를 미들웨어로 관리
매우 편리하게 유효성 검사를 할 수 있게 되었지만, 구현해야 할 API가 많을 때 이를 일일히 다 작성하는 것은 매우 힘든 일이다.
매번 const results = validationResult() .... 를 작성하지 말고 미들웨어로 관리하여 보자.
function validationError(req, res) {
const result = validationResult(req);
if (!result.isEmpty()) {
return res.status(400).json(result.array());
}
}
.get(body("userId").notEmpty().isInt(), (req, res) => {
validationError(req, res);
먼저 함수로 빼서 위와 같이 작성할 수 있을 것이다.
자주 사용하던 코드들을 validationError()로 호출할 수 있게 되어 편리해졌다.
function validationError(req, res, next) {
const result = validationResult(req);
if (!result.isEmpty()) {
return res.status(400).json(result.array());
}
next();
}
.get([body("userId").notEmpty().isInt(), validationError], (req, res) => {
다른 방법으로 핸들러를 통해 유효성 검사를 진행할 수도 있다.
단 이 경우에는 next라는 파라미터를 추가로 받아 함수에 추가해주어야 하며,
유효성 검사를 진행하는 body("userId")... 부분을 배열로 감싼 뒤 맨 마지막에 validationError를 추가해주면 된다.