Validation有効性Sainitiation

3997 ワード

📌 ゆうこうせい


データベースにアクセスすると、ネットワークコストが発生する可能性があります.そのため、データベースにアクセスする前に、データが有効かどうかを確認し、消毒によって一貫したストレージを確保する必要があります.npm i express-validatorexpress validator github

📌 express-validatorの使用


request

{
    "name":"a",
    "age":1,
    "job": {
        "name" : "DC academy",
        "title" : "instructor"
    },
    "email" : "[email protected]"
}

express example

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

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

app.post(
  '/users',
  body('name')     //<<<--- name validation
    .isLength({ min: 2, max: 10 })
    .withMessage('이름은 두글자 이상이야'), 
  body('age')      //<<<--- age validation
    .notEmpty()
    .isInt()
    .withMessage('숫자를 입력해'), 
  body('job.name') //<<<--- job.name validation
    .notEmpty()
    .isLength({ min: 2 })
    .withMessage('두글자 이상 입력해'),
  (req, res, next) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return res.status(400).json({ message: errors.array() });
    }
    console.log(req.body);
    res.sendStatus(201);
  }
);

app.get(
  '/:email',
  param('email')  // <<<--- param을 검사
    .isEmail()
    .withMessage('이메일 입력해'),
  (req, res, next) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return res.status(400).json({ message: errors.array() });
    }
    res.send('good');
  }
);

app.listen(8080);

📎 chaining

body('name')
  .notEmpty()
  .withMessage('이름을 입력해')
  .isLength({min:2})
  .withMessage('두글자 이상')
  • 名前は空にできません.
  • が空の場合、エラーメッセージ(入力名)
  • 名前には少なくとも2文字が必要です.
  • 2 2 2文字以上でない場合、エラーメッセージ(「2文字以上」)
  • 📎 サンプル再構築


    validate関数を作成して処理します.
    const validate = (req, res, next) => {
      const errors = validationResult(req);
      if (errors.isEmpty()) {
        return next();
      }
      return res.status(400).json({ message: errors.array()[0] }); //<<-- 첫번째 메시지만 보내주고 싶을 경우
    };
    
    app.post(
      '/users',
      body('name')
        .notEmpty()
        .withMessage('이름을 입력해')
        .isLength({ min: 2 })
        .withMessage('두글자 이상'),
      body('age').notEmpty().isInt().withMessage('숫자를 입력해'),
      body('job.name') //<<<--- age validation
        .notEmpty()
        .isLength({ min: 2 })
        .withMessage('숫자를 입력해'),
      validate,        //<<<--- validate 함수 추가
      (req, res, next) => {
        console.log(req.body);
        res.sendStatus(201);
      }
    );
    
    app.get(
      '/:email',
      param('email').isEmail().withMessage('이메일 입력해'),
      validate,       //<<<--- validate 함수 추가
      (req, res, next) => {
        res.send('good');
      }
    );

    📌 Sanitization


    有効性検査を行う場合は、ユーザから受け取ったデータを消毒する.
    たとえば、名前が「jh o n」の場合、「jh o n」などの無効な書き込みを処理する必要があります.
    app.post(
      '/users',
      [
        body('name').trim().isLength({ min: 2 }).withMessage('두글자 이상'), 
        //<<<--- 띄어쓰기 trim
        body('age').notEmpty().isInt().withMessage('숫자를 입력해'),
        body('email').isEmail().withMessage('email 입력하세요')
          .normalizeEmail(),    //<<--- 이메일 대문자를 소문자로 변경
      ],
      (req, res, next) => {
        console.log(req.body);
        res.sendStatus(201);
      }
    );

    Contract Testing : Client-Server


    契約テストの説明