[Node.js] JOI (Validator)

유동균·2023년 2월 3일
0

Node.js

목록 보기
7/11
post-thumbnail

Validation 유효성 검사란

  • 말그대로 validation은 어떤 것을 검증하는 것.
  • 어떤 요청에 필요한 모든 데이터가 정상적으로 들어왔는지 안 들어왔는지를 확인하는게 validation이다.

Joi

사용자가 입력한 데이터가 유효한지 검사하는 유효성 검사 라이브러리

Install

> npm i joi

Import

const Joi = require('joi')

Usage

const express = require("express");
const Joi = require("joi");

const app = express();

app.get("/api/user/:id", async (req, res) => {
    const { id } = req.params;
   
    // 규칙을 정해준다.
    const schema = Joi.number().min(100).require();

    try {
        // 검사시작
      	// validateAsync 는 비동기적인 체크가 가능하기 때문에 절차실행에 있어 좋다.
        await schema.validateAsync(id);   
    } catch (e) {
        // 유효성 검사 에러
        return res.status(400).json({ code: 400, message: e.message })
    }

    res.json({ code: 200 })
})

사용예1

// { number, string }
Joi.object({
    number: Joi.number()
    string: Joi.string()
})

// Array<number>
Joi.array().items(Joi.number())

// Array<number>  number > 10 and number < 20
Joi.array().items(Joi.number().min(10).max(20))

// a < b
Joi.object({
    a: Joi.number().max(Joi.ref('b'))
    b: Joi.number()
})
  
// ['a', 'a'] (x)  즉, 중복값 허용 안됨
Joi.array().items(Joi.string()).unique() 

// 다른 배열에 있는 수와 같으면 안됨
const a = [1,2,3,4]
const b = [1,2]

Joi.object({
    a: Joi.array().items(Joi.number().invalid(...b)),
    b: Joi.array().items(Joi.number())
})

/* 1,2 가 중복되므로 에러 발생 */

사용예2

const Joi = require('joi');

// validate할 schema 정의
const schema = Joi.object().keys({
  username: Joi.string().min(3).max(30).required(),
  birthyear: Joi.number().integer().min(1900).max(2018),
});

// validate할 object
const user = {
  username: 'username1',
};

// validate
const {error, value} = Joi.validate(user, schema);
console.log(error); // null
console.log(value); // {username: "username1"}
  • 입력인 user가 미리 정의된 schema와 일치하는지를 확인한다.

  • schema는 다음과 같이 정의되었다.

    • username: string이고, 길이가 최소 3글자에서 최대 30글자이며, 필수 항목임.
    • birthyear: number이고, integer이며, 최소 1900에서 최대 2013까지 허용하고, 옵션 항목임.
    • 따라서 user.username은 schema에 정의된 내용에 부합하고, user.birthyear는 optional로 정의되었기 때문에 없어도 문제 없이 validate되었다.

  • Error가 나는 경우
const Joi = require('joi');

const schema = Joi.object().keys({
  username: Joi.string().min(3).max(30).required(),
  birthyear: Joi.number().integer().min(1900).max(2023),
});

const user = {
  username: 'username1',
  birthyear: 2025,
};
const {error, value} = Joi.validate(user, schema);
console.log(error); // Error: child "birthyear" fails because ["birthyear" must be less than or equal to 2023]
console.log(value); // {username: "username1", birthyear: 2025}
  • user.birthyear가 정의된 최대값 2018보다 크기 때문에 validate error가 났다.
  • Joi.validate return 값의 value는 원래 입력값인 user의 내용이 그대로 표시되므로, return 값의 error가 null 인지 아닌지로 validate 성공, 실패 여부를 확인하면 된다.

0개의 댓글