GraphQL에 그래프 넣기

3139 단어 graphqlapollo
GraphQL API에서 그래프를 디자인하는 방법을 이해하는 데 시간이 좀 걸렸습니다. REST 에서 처음으로 Query type 에 많은 쿼리를 추가했습니다.

예를 들어 Pen 에 대한 주석을 가져오기 위해 쿼리 유형에 comments 쿼리를 추가하고 item_iditem_type를 인수로 전달했습니다.


개요



type Query {
  "List of Item Comments"
  comments(input: CommentsInput!): CommentsPaginated
}

input CommentsInput {
  pagination: PaginationInput = {}
  filters: CommentsFiltersInput!
}

input CommentsFiltersInput {
  itemId: ID!
  itemType: ItemEnum!
}





질문



query Comments($input: CommentsInput!) {
  comments {
    id
    owner {
      id
      username
    }
    text
  }
}





변수



"variables": {
  "input": {
    "filters": {
      "itemID": "hwvmeXVR"
      "itemType": "Pen"
    }
  }
}



이것은 잘 작동했지만 API의 Query 유형에 주석을 달 이유가 없었습니다. 여러 항목에 속한 댓글을 쿼리하고 싶었던 적이 없었습니다. Item(일명 펜, 프로젝트 또는 컬렉션)에 대한 특정 댓글만 받았습니다.

얼마 후, 모든 쿼리를 Query 유형에 넣을 필요가 없고 스키마의 모든 개체에 쿼리를 넣을 수 있다는 것을 깨달았습니다. 그래서 댓글 쿼리를 Item 인터페이스로 옮겼습니다. 이제 Pen , ProjectCollection 개체에서 주석을 사용할 수 있습니다.


개요



"A CodePen Item - Pen, Collection, Post or Project"
interface Item {
  "List of Item Comments"
  comments(input: PaginationInput = {}): CommentsPaginated
}





질문



query CommentsQuery(
  $id: ID!
  $itemType: ItemEnum!
  $commentsPaginationInput: PaginationInput
) {
  item(id: $id, itemType: $itemType, token: $token) {
    id
    comments(input: $commentsPaginationInput) {
      records {
        id
        ...CommentDetails
      }
    }
  }
}



이것이 GraphQL 그래프의 요점입니다. 서버에 요청할 수 있는 데이터 모델에 대해 생각하는 대신 비즈니스 논리의 노드가 서로 연결되고 관련되는 방법에 대해 생각합니다.

이 새로운 디자인 선택의 장점은 주석에 대한 리졸버를 단순화했다는 것입니다. 이전에는 DB에서 항목을 선택하고 로그인한 사용자에게 해당 항목에 대한 액세스 권한이 있는지 확인한 다음 댓글을 검색해야 했습니다. 새 확인자는 권한 확인이 그래프에서 더 완료되었다는 확신과 함께 항목 레코드를 전달받습니다. 즉, comments 확인자가 더 적은 작업을 수행해야 합니다.

좋은 웹페이지 즐겨찾기