Могу ли я добавить данные в ребро GraphQL? - PullRequest
0 голосов
/ 01 марта 2019

Я играю с GraphQL и сталкиваюсь с концепцией соединений и ребер.

Из того, что я понимаю, нередко видеть метаданные в соединении, например свойство totalCountв следующем фрагменте.

type UserFriendsConnection {
  pageInfo: PageInfo!
  edges: [UserFriendsEdge]
  totalCount: Int
}

Мои вопросы таковы: можно ли ставить произвольные метаданные также и на краю, и если следующий способ был бы приличным способом сделать это.

Я чувствовалкак запрос и ответ лучше всего иллюстрируют то, что я ищу.Это свойство role, которое я хочу разместить где-то, имеет смысл.

Мне кажется, что оно не относится к типу User, поскольку роль описывает тип связи / отношения, который имеет UserGroup.

# Query

{
  me {
    id
    name
    groupsConnection {
      edges {
        node {
          id
          name
          membersConnection {
            edges {
                node {
                id
                name
              }
              role                             <--- HERE
            }
          }
        }
        role                                   <--- HERE
      }
    }
  }
}
# Response

{
  "data": {
    "me": {
      "id": "1Edj3hZFg",
      "name": "John Doe",
      "groupsConnection": {
        "edges": [
          {
            "node": {
              "id": "bpQgdZweQE",
              "name": "Fishing Team",
              "membersConnection": {
                "edges": [
                  {
                    "node": {
                      "id": "1Edj3hZFg",
                      "name": "John Doe"
                    },
                    "role": "ADMINISTRATOR"    <--- HERE
                  },
                  {
                    "node": {
                      "id": "7dj37dH2d",
                      "name": "Rebecca Anderson"
                    },
                    "role": "MEMBER"           <--- HERE
                  }
                ]
              }
            },
            "role": "ADMINISTRATOR"            <--- HERE
          }
        ]
      }
    }
  }
}

1 Ответ

0 голосов
/ 01 марта 2019

Соединения являются частью Спецификации реле .Сам Relay является клиентом GraphQL, хотя вы можете иметь совместимый с Relay сервер GraphQL без фактического использования Relay на внешнем интерфейсе.Согласно спецификации:

Типы ребер должны иметь поля с именами узел и курсор.Они могут иметь дополнительные поля, связанные с ребром, как считает дизайнер схемы.

Достаточно часто видеть дополнительные поля для этих типов, и это, безусловно, имеет смысл.Одно слово предостережения, хотя.Если у нас есть тип User, мы можем создать UserConnection и UserEdge:

type UserConnection {
  pageInfo: PageInfo!
  egdes: [UserEdge!]!
}

type UserEdge {
  cursor: String!
  edge: User!
}

Затем мы можем использовать этот тип соединения во всех видах мест ...

type Query {
  allUsers: UserConnection!
  # other fields
}

type Group {
  members: UserConnection!
  # other fields
}

type User {
  coworkers: UserConnection!
  # other fields
}

Однако, если вы добавите поле типа role в UserEdge, это поле будет иметь смысл только в контексте поля members для типа Group.Во всех других контекстах должно быть возвращено пустое или фиктивное значение, что может привести к ненужной путанице.

Это означает, что если вы собираетесь ввести дополнительные поля в тип ребра, которые зависят от отношений, вывероятно, следует создать типы соединений и ребер, характерные для этих отношений:

type GroupUserConnection {
  pageInfo: PageInfo!
  egdes: [GroupUserEdge!]!
}

type GroupUserEdge {
  cursor: String!
  edge: User!
  role: Role!
}

Таким образом, вы все равно можете использовать обычный UserConnection для других полей и избежать ненужного запроса клиентами role там, где нетне один.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...