AWS Amplify API 입력 유효성 검사를 수행하는 방법

이 기사는 무엇입니까

  • Amplify CLI를 사용하면 AppSync+DynamoDB를 사용하는GraphiQL API를 쉽게 만들 수 있습니다.( 공식 링크 )
  • 개발자가 다음 schema를 정의하면 Amplify CLI는 DynamoDB의 테이블, AppSync의 해석기(query,mutation,subscribe)를 생성합니다.
  • schema의 예
    type Blog @model {
      id: ID!
      name: String!
      posts: [Post] @connection(name: "BlogPosts")
    }
    type Post @model {
      id: ID!
      title: String!
      blog: Blog @connection(name: "BlogPosts")
      comments: [Comment] @connection(name: "PostComments")
    }
    type Comment @model {
      id: ID!
      content: String
      post: Post @connection(name: "PostComments")
    }
    
  • 상기 예 중의 @model@connection는 지시성이라고 불리며 schema가 해석기를 어떻게 생성하는지 제어한다(대략).
  • Issue에서도 논의되었지만 현재 입력의 유효성을 정의하는 지시가 없습니다.개발여기.할 때는 다이나모DB에 사용자 입력을 써야 하는데 "어, 검증이 안 됐거나 너무 무서웠지...?"됐어.
  • 따라서 Amplify CLI에서 생성된 .vtl 파일[1]을 직접 편집해야 합니다.나는 그 방법을 비망록으로 남겼다.
  • 전제 조건

  • Amplify CLI 3.3.26
  • 문제 설정


    다음 schema를 정의할 때 id의 길이에 대한 제한을 설정합니다.(예: 공백 및 50자 미만 금지)
    schema.graphql
    type Fav @model
      @key(fields:["owner", "id"])
      owner: ID!
      id: ID!
    }
    

    절차.


    (Amplifyapi의 추가로 앞당겨 완성...)

  • 해석기를 생성하기 위해 amplify push 실행
  • 생성된 용균기에 추가적인 유효성을 필요로 하는 처리용 용균기(예를 들어CreateFav 등)를 복사하여 지정된 위치에 보관한다.
  • 해석기의 생성 위치
    ProjectRoot
      |- amplify
          |- backend
              |- api
    	      |- yourApiName
    	          |- build
    		  |   |- resolvers  --- ※ここに生成される
    		  |
    		  |- resolvers -------- ※ここにコピーして保存する
    
    두 번째 단계에 따라 지정된 폴더.vtl에 파일을 저장하면 자동으로 생성된 해석기가 무시됩니다.
    따라서 데이터 구조 등을 중도에 바꾸면 낡은 해석기를 삭제한다
  • 복사된 파일을 다음과 같이 편집합니다.솔직히 VTL의 기술방법을 몰라서 삽입 위치는 모색감이 있지만 자동으로 생성된 주석을 단서로 primarykey를 추가하기 전에 검증을 실시하기 위해 아래 위치에 삽입했다.
  • (略)
    + ## Custom for input validation
    + #if($util.isNullOrBlank($ctx.args.input.id))
    +   $util.appendError("id must exist", "id", null, $ctx.args.input.id)
    + #end 
    + #if($ctx.args.input.id.length() > 50))
    +   $util.appendError("The request would not be proper", "id", null, ctx.args.input.id)
    + #end
    
    + #if($ctx.outErrors.size() > 0)
    +   #return($ctx.outErrors)
    + #end
    
    ## [Start] Set the primary @key. **
    #set( $modelObjectKey = {
      "owner": $util.dynamodb.toDynamoDB($ctx.args.input.owner),
      "id": $util.dynamodb.toDynamoDB($ctx.args.input.id)
    } )
    ## [End] Set the primary @key. **
    
    ## [Start] Prepare DynamoDB PutItem Request. **
    (略)
    
  • 저장된 파일을 다시 쓴 후 다시 amplify push.
  • 끝말


    수고하셨습니다.이상은 설정 방법입니다.신중을 기하기 위해 AppSync 콘솔 등을 사용하여 타겟별로 검증되었는지 확인해 보십시오.
    각주
    사용자 정의 카탈로그를 만드는 방법도 있죠 앰플리파이 문서에 해설이 있긴 하지만 그걸 할 끈기가 없어서...↩︎

    좋은 웹페이지 즐겨찾기