Соединения являются частью Спецификации реле .Сам 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
там, где нетне один.