본문 바로가기
Web/Node.js

12. Validate(데이터 검증)

by 사라리24 2024. 4. 29.
SMALL

1. Validate

express-validator
Express.js를 사용하여 웹 애플리케이션을 개발할 때 입력 데이터의 유효성을 검사하기 위한 패키지
npm i express-validator를 통해 validator 설치
모듈 안의 여러 매서드를 사용하여 제한을 걸어줌

 

  • 설치
            
 
       npm i express-validator
 
 

 

  • 파일생성

 

  • validation_ 파라미터에 대한 GET 요청
 
      < validation.js >

            import express from 'express';
            import {body,param,validationResult} from 'express-validator';


            const app = express();
            app.use(express.json());


            const validate=(req,res,next)=>{
                const errors=validationResult(req);
                if(errors.isEmpty()){
                    return next();
                }
                return res.status(400).json({message:errors.array()[0].msg});
            };


            app.get('/:email', [param('email').isEmail().withMessage('이메일을 입력하세요!'), validate], (req, res, next) => {
                res.send(' 💌 ');
            });
            app.listen(8080);
 

        < /validation.js >
 
 
  1. validate 함수를 정의합니다. 이 함수는 요청에 대한 유효성 검사 결과를 확인하고,
    오류가 발생한 경우 해당 오류 메시지를 클라이언트에 반환합니다. 만약 오류가 없다면 다음 미들웨어로 넘어갑니다.
  2. GET 요청에 대한 라우터를 설정합니다. 이 라우터는 '/:email' 엔드포인트에 대한 GET 요청을 처리합니다.
    email이라는 파라미터를 받고, 이메일 형식인지를 검사합니다.
    만약 이메일 형식이 아니라면 '이메일을 입력하세요!'라는 메시지를 반환합니다.
    이후 validate 미들웨어를 통해 유효성 검사를 수행합니다.
  3. 실제 요청을 처리하는 콜백 함수가 정의됩니다. 이 함수는 간단히 ':연애편지:'라는 문자열을 응답으로 보냅니다.





 

 

  • isLength()
    - 길이선정
    - 최솟값 최솟값설정 가능
 
 
         param('email').isLength( {min:7})
  
 

 

  • isEMail() : 이메일 형태 확인
   
 
      param('email').isEmail()
  
 

 

  • isInt() : 숫자의 최소 또는 최대값 검증
 
 
       body('age').isInt()
 
  
 

 

  • matches(): 정규표현식을 사용하여 문자열의 패턴을 검증
  
 
      param('name').maches()
  
 
 

 

  • trim() : 공백없애기
  
           param('email').trim()
 
  
 

 

  • withMessage() : 문자 보내기
  
 
       param('email').withMessage('이메일은 7글자 이상!')]
 
 
 
 

 

  • notEmpty() : 빈칸아닌 형태 인지 확인
 
       param('email').notEmpty()]
  
 

 

  • validation_'/users' 엔드포인트에 대한 POST 요청
 
      < validation.js에 추가 >
 
            //[]: validation 기능을 안에다 쓸 수 있다
            // 메서드 체이닝으로 벨리데이션 쓰기
            // trim: 공백 없애기
            // isLength: 최대최소 설정
            // post: 자료를 bbody로 받음
            // get: param로 받음
 

                app.post('/users', [
                    body('name').trim().isLength({min:2}).withMessage('이름은 두글자 이상으로 입력!'),
                    body('age').isInt().withMessage('나이는 숫자로 입력!'),
                    body('height').isInt({min:100, max:200}).withMessage('키는 100이상 200이하로 입력하세요!'),
                    body('job').notEmpty(),
                    validate
                ], (req, res, next) => {
                    console.log(req.body);
                    res.sendStatus(201);
                })


            app.listen(8080);
 
       <validation.js   >
  
  1. 먼저, '/users'에 대한 POST 요청을 처리하기 위한 미들웨어를 정의합니다. 이 미들웨어는 다음과 같은 단계들을 거칩니다:
    • 요청 본문의 'name' 필드의 값이 최소 2글자 이상인지 확인하고, 그렇지 않으면 '이름은 두 글자 이상으로 입력!'이라는 메시지를 반환합니다.
    • 요청 본문의 'age' 필드의 값이 정수인지 확인하고, 그렇지 않으면 '나이는 숫자로 입력!'이라는 메시지를 반환합니다.
    • 요청 본문의 'email' 필드의 값이 이메일 형식인지 확인하고, 그렇지 않으면 '이메일을 입력!'이라는 메시지를 반환합니다.
    • 요청 본문의 'job.name' 필드가 비어있지 않은지 확인합니다.
    • 위의 모든 검증이 통과되면 다음 미들웨어로 넘어갑니다.
  2. 실제 요청을 처리하는 콜백 함수가 정의됩니다. 이 함수는 요청 본문(req.body)을 콘솔에 로그로 출력한 후,
    상태 코드 201을 응답으로 보냅니다.
  3. 서버를 8080 포트에서 실행합니다.

 
  • 문제:
    post, put에 text에 대해 빈문자열을 없애고, 최소 3자 이상 입력해야 데이터를 저장하도록 API에 적용
 
      <router> tweets.js >

            import express from "express";
            import * as tweetController from '../controller/tweet.js'
            import { body } from 'express-validator'; //추가
            import { validate } from "../middleware/validator.js"; //추가


            const router = express.Router();

            /*
            post, put에 text에 대해 빈문자열을 없애고, 최소 3자 이상 입력해야 데이터를 저장하도록 API에 적용
            */
            const validateTweet = [
                body('text').trim().isLength({min: 3}).withMessage('최소 3자 이상 입력'), validate
            ]
           //추가

            // 해당 아이디에 대한 트윗 가져오기
            // GET
            // http://localhost:8080/tweets?username=:username
            router.get('/', tweetController.getTweets);


            // 글번호에 대한 트윗 가져오기
            // GET
            // http://localhost:8080/tweets/:id
            router.get('/:id', tweetController.getTweet);


            // 트윗하기
            // POST
            // http://localhost:8080/tweets
            // name, username, text
            // json 형태로 입력 후 추가된 데이터까지 모두 json으로 출력
            router.post('/', validateTweet, tweetController.createTweet); //추가


            // 트윗 수정하기
            // PUT
            // http://localhost:8080/tweets/:id
            // id, username, text
            // json 형태로 입력 후 변경된 데이터까지 모두 json으로 출력
            router.put('/:id', validateTweet, tweetController.createTweet); //추가


            // 트윗 삭제하기
            // DELETE
            // http://localhost:8080/tweets/:id
            router.delete('/:id', tweetController.deleteTweet);


            export default router;
 
       </ router> tweets.js  >
  

 

  1. Express와 tweetController, validator를 import합니다.
  2. Express의 Router를 사용하여 새 라우터를 생성합니다.
  3. tweet 텍스트의 유효성을 검사하는 미들웨어인 validateTweet을 정의합니다. 이 미들웨어는 트윗 텍스트를 trim하여 공백을 제거하고, 최소 3자 이상이어야 한다는 규칙을 적용합니다.
  4. 라우터에 다양한 HTTP 요청을 처리하는 핸들러 함수들을 설정합니다:
    • GET /tweets: 모든 트윗을 가져오는 엔드포인트입니다.
    • GET /tweets/:id: 특정 트윗을 가져오는 엔드포인트입니다.
    • POST /tweets: 새로운 트윗을 생성하는 엔드포인트입니다. 요청 본문에는 name, username, text 필드가 있어야 합니다. validateTweet 미들웨어를 통해 트윗 텍스트의 유효성을 검사합니다.
    • PUT /tweets/:id: 특정 트윗을 수정하는 엔드포인트입니다. 요청 본문에는 id, username, text 필드가 있어야 합니다. validateTweet 미들웨어를 통해 트윗 텍스트의 유효성을 검사합니다.
    • DELETE /tweets/:id: 특정 트윗을 삭제하는 엔드포인트입니다.
  5. 라우터를 내보냅니다.

 

 
      <middlewear> validator.js >

            import { validationResult } from "express-validator";

            export const validate = (req, res, next) => {
                const errors = validationResult(req);
                if(errors.isEmpty()){
                    return next();
                }
                return res.status(400).json({message:errors.array()[0].msg})
            }
 
       </ middlewear>  validator.js   >
 
  

 

id = apple 검색
전체검색
2검색

 

새로운 트윗 추가
새로운 트윗 추가(오류)
수정하기 (오류)

 

수정하기(실행)
삭제 확인

 

 

2. 과제

  

 

  • 과제
    - router, data, controller에 auth.js를 추가하고 tweet.js를 참고하여 적용
    - 회원가입, 로그인(회원정보 확인, 아이디를 보내면 해당 객체의 정보만 출력)

    usets = [
       {
             id: '1',
             username: 'apple',
             password: '1111', 
             name: '김사과',
             email: 'apple@apple.com',
             url: 'https://www.logoyogo.com/web/wp-content/uploads/edd/2021/02/logoyogo-1-45.jpg'
        },
       {
         ...
        }

      ]
  •  
  
       < data > auth.js >
 
            let users = [
                {
                    id: '1',
                    userid: "apple",
                    password: "1111",
                    name: "김사과",
                    email: "apple@apple.com",
                },
               
                {
                    id: '2',
                    userid: "banana",
                    password: "2222",
                    name: "반하나",
                    email: "banana@banana.com",
                }
            ]

            export async function createUser(username, password, name, email){
                const user ={
                    id: "10",
                    username,
                    password,
                    name,
                    email,
                }
                users = [user, ...users]
                return users;
            }
            export async function login(username){
                return users.find((users) => users.username === username);
            }
 
 
       </ data > auth.js  >
 
  
 

 

  •  
 
      <  controller > auth.js  >

            import * as authRepository from '../data/auth.js';


            // 회원가입 함수
            export async function signup(req, res, next) {
                const {username, password, name, email} = req.body;
                const users = await authRepository.createUser(username, password, name, email);
                    res.status(201).json(users);
                }

            // 로그인하는 함수
            export async function login(req, res, next) {
                const {username, password, name, email} = req.body;
                const user = await authRepository.login(username);
                if(user){
                    res.status(201).json( `${username} 로그인 완료`);
                }else{
                    res.status(404).json({message: `${username}님의 아디디 또는 비밀번호가 없습니다`})
                }
            }

       </ controller > auth.js >
  
 
  •  
  
      < router > auth.js  >

            import express from 'express';
            import { body } from 'express-validator';
            import * as authController from "../controller/auth.js";
            import { validate } from "../middleware/validator.js";

            const router = express.Router();

            const validateSignup = [
                body('username').trim().isLength({ min: 3 }).withMessage('최소 3자 이상 입력'),
                body('password').trim().isLength({ min: 4 }).withMessage('최소 4자 이상 입력'),
                body('email').trim().isEmail().withMessage('이메일 형식 확인'),
                validate
            ]

            router.post('/signup', validateSignup, authController.signup);
            router.post('/login', authController.login);
            export default router;
 
       < router /js >
  
 
 
  •  
 
      < aps.js >

            import express from "express";
            import morgan from "morgan";
            import tweetsRouter from './router/tweets.js'
            import authRouter from "./router/auth.js"; //추가

            const app = express();
            app.use(express.json()); 

            app.use(morgan("dev"));
            app.use('/tweets', tweetsRouter); 
            app.use('/auth', authRouter); //추가
            app.use((req, res, next) => {
                res.sendStatus(404);
            });

            app.listen(8080);

       </ aps.js  >
  
 
  •  

 

 

 

  • Git에 commit 하기

 

 

 

 

'Web > Node.js' 카테고리의 다른 글

14. Postman 정리, 아이디 중복체크  (0) 2024.05.02
13. Authentication, bcrypt, JWT  (0) 2024.04.29
11. 리팩토링  (0) 2024.04.26
10. 실습: Tweet  (0) 2024.04.26
09. git 설치, github 간단 연동  (0) 2024.04.25