Мне интересно использовать GraphQL, и я только начал с ним экспериментировать.
В GraphQL руководство можно увидеть следующую цитату:
Each field in a GraphQL schema is backed by a resolver.
Но если вы посмотрите на гклген (это библиотека golang для создания серверов GraphQL), пример использует следующую схему:
...
type MyQuery {
todo(id: ID!): Todo
lastTodo: Todo
todos: [Todo!]!
}
type MyMutation {
createTodo(todo: TodoInput!): Todo!
updateTodo(id: ID!, changes: Map!): Todo
}
type Todo {
id: ID!
text: String!
done: Boolean!
}
...
на самом деле он использует 3 автоматически сгенерированных распознавателя (т. е. 1 для каждого запрос, а не для поля):
func (r *QueryResolver) Todo(ctx context.Context, id int) (*Todo, error) {
func (r *QueryResolver) LastTodo(ctx context.Context) (*Todo, error) {
func (r *QueryResolver) Todos(ctx context.Context) ([]*Todo, error) {
Является ли ожидаемым поведением автоматическое создание преобразователей не для каждого поля (а вместо этого для каждого запроса)?

Когда весь тип поддерживается преобразователем, все равно верно, что каждое поле поддерживается преобразователем;)
По сравнению с SQL - обычно вы не запрашиваете каждое (одно) поле отдельно, когда вам нужна вся запись/строка.
Преобразователи уровня полей необходимы, когда преобразователь типов не возвращает данные для всех обязательных (по запросу) полей — например, для отношений.
Я буду рад примеру на любом языке программирования (хочу увидеть типы с отношениями и обязательными полями). Кстати, правильно ли, что если я создам связь между двумя типами: т. Е. сделать содержит задача, тогда я ожидаю отдельного автоматически сгенерированного преобразователя для задачи?
В библиотеке, которую вы используете... гклген - у вас есть friends - поле для связи с отдельным преобразователем
А как работает 2 резольвера под капотом в gqlgen? То есть, если есть users.friends поле и allUsers запрос, будет ли users_resolver инициализировать все поля, кроме .friends, а затем friends будет разрешаться отдельно его преобразователем? Я действительно не понимаю рабочий процесс, так как allUsers возвращает [Users], и мы не можем инициализировать поле users.friends.
'engine' пытается собрать необходимые данные для всех полей - для каждого объекта (User) используются дополнительные распознаватели и каждое поле/свойство (не определено при запуске), не разрешенное распознавателем типа (на каждом уровне, сверху вниз) - возвращает null для не разрешенные поля (нет преобразователя полей, нет соответствующих данных и т. д.)
Это выглядит как один преобразователь для каждого поля в типе
MyQuery, который является типом запроса верхнего уровня (но в остальном это обычный тип объекта GraphQL).