Ajv를 사용하는 Node.js의 JSON 스키마 유효성 검사

소개



JavaScript 및 Node.js로 작업하는 경우 프런트엔드 또는 백엔드에서 데이터 유효성 검사를 수행해야 할 필요성을 이미 느꼈을 것입니다.

데이터 유효성 검사를 수행하는 여러 라이브러리와 접근 방식이 있으며 대부분의 경우 추상화를 사용하는 것을 좋아하지만 때때로 JSON 스키마를 정의한 다음 동일한 JSON 스키마를 통해 데이터의 유효성을 검사해야 합니다.

그리고 같은 이유로 오늘 기사에서 우리는 Ajv를 사용할 것입니다. 유효성 검사기 외에도 유효성 검사 기준을 "확장"하는 데 도움이 되는 여러 플러그인이 있습니다.

전제 조건



계속 진행하기 전에 다음 기술에 대한 기본 지식이 있어야 합니다.
  • 노드
  • NPM
  • JSON 스키마

  • 시작하기



    먼저 프로젝트 폴더를 생성해 보겠습니다.

    mkdir node-ajv
    cd node-ajv
    npm init -y
    


    프로젝트package.json에서 다음 속성을 추가합니다.

    {
      "type": "module",
    }
    


    이제 프로젝트에 Ajv를 설치해 보겠습니다.

    npm install ajv --save
    


    다음 단계는 src/라는 파일의 schema.js 폴더 안에 있을 JSON 스키마를 생성하는 것입니다.

    export const authSchema = {
      type: "object",
      properties: {
        username: {
          type: "string",
          description: "Username of the user",
        },
        email: {
          type: "string",
          description: "Email of the user",
        },
        password: {
          type: "string",
          description: "Password of the user",
          minLength: 8,
          maxLength: 24,
        },
      },
      required: ["username", "email", "password"],
      additionalProperties: false,
    };
    


    그런 다음 validator.js를 생성할 수 있습니다. 이 파일에는 Ajv 인스턴스와 새 유효성 검사기를 생성할 때마다 재사용할 팩토리가 포함됩니다.

    import Ajv from "ajv";
    import { inspect } from "util";
    
    const ajv = new Ajv({ allErrors: true });
    
    export const validatorFactory = (schema) => {
      const validate = ajv.compile(schema);
    
      const verify = (data) => {
        const isValid = validate(data);
        if (isValid) {
          return data;
        }
        throw new Error(
          ajv.errorsText(
            validate.errors?.filter((err) => err.keyword !== "if"),
            { dataVar: "schemaValidation" } + "\n\n" + inspect(data)
          )
        );
      };
    
      return { schema, verify };
    };
    


    알다시피 validatorFactory() 함수는 schema(JSON 스키마에 해당) 인수를 받아 다음 두 가지 속성을 반환합니다.
  • schema - 함수 인수에 전달된 스키마의 "복사본"(원하는 경우 전체 복사를 수행할 수 있음)
  • verify - 유효성을 검사하려는 데이터를 인수에서 수신하고 동일한 데이터가 유효하면 유효성 검사가 성공하여 반환되며, 그렇지 않으면 오류가 발생합니다
  • .

    이 문서를 쉽게 테스트할 수 있도록 간단한 API를 만들고 먼저 종속성을 설치합니다.

    npm install koa @koa/router koa-body --save
    


    그런 다음 기본 API를 만듭니다.

    import Koa from "koa";
    import Router from "@koa/router";
    import koaBody from "koa-body";
    
    const app = new Koa();
    const router = new Router();
    
    app.use(koaBody());
    
    router.post("/", async (ctx) => {
      ctx.body = "Hello, World";
    });
    
    app.use(router.routes());
    
    app.listen(3000);
    


    마지막으로 생성된 스키마와 유효성 검사 팩토리를 가져온 다음 authValidation라는 유효성 검사기를 생성하고 http 요청 본문에서 데이터의 유효성을 검사합니다. 이 방법:

    import Koa from "koa";
    import Router from "@koa/router";
    import koaBody from "koa-body";
    
    import { validatorFactory } from "./validator.js"; //  👈 added this
    import { authSchema } from "./schema.js"; //  👈 added this
    
    const authValidation = validatorFactory(authSchema); //  👈 added this
    
    const app = new Koa();
    const router = new Router();
    
    app.use(koaBody());
    
    // 👇 changes have been made here
    router.post("/", async (ctx) => {
      const body = ctx.request.body;
      const data = authValidation.verify(body);
      ctx.body = { data };
    });
    
    app.use(router.routes());
    
    app.listen(3000);
    


    이제 다음과 같이 POST에서 http://localhost:3000로 http 요청을 할 수 있습니다.

    {
      "email": "[email protected]",
      "username": "random",
      "password": "randomPaswword"
    }
    


    결론



    늘 그렇듯이 기사가 마음에 드셨기를 바라며 기존 프로젝트에 도움이 되었거나 단순히 사용해 보고 싶으셨기를 바랍니다.

    기사에서 잘못된 부분을 발견했다면 댓글로 알려주시면 수정하겠습니다. 마치기 전에 이 기사의 소스 코드에 액세스하려면 github 저장소에 대한 링크here를 남겨둡니다.

    좋은 웹페이지 즐겨찾기