Должен ли я создавать резолвер для каждого запроса или для всех его полей в GraphQL?

Мне интересно использовать 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) {

Является ли ожидаемым поведением автоматическое создание преобразователей не для каждого поля (а вместо этого для каждого запроса)?

Это выглядит как один преобразователь для каждого поля в типе MyQuery, который является типом запроса верхнего уровня (но в остальном это обычный тип объекта GraphQL).

David Maze 02.06.2019 12:14
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
1
250
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда весь тип поддерживается преобразователем, все равно верно, что каждое поле поддерживается преобразователем;)

По сравнению с SQL - обычно вы не запрашиваете каждое (одно) поле отдельно, когда вам нужна вся запись/строка.

Преобразователи уровня полей необходимы, когда преобразователь типов не возвращает данные для всех обязательных (по запросу) полей — например, для отношений.

Я буду рад примеру на любом языке программирования (хочу увидеть типы с отношениями и обязательными полями). Кстати, правильно ли, что если я создам связь между двумя типами: т. Е. сделать содержит задача, тогда я ожидаю отдельного автоматически сгенерированного преобразователя для задачи?

James Larkin 02.06.2019 10:09

В библиотеке, которую вы используете... гклген - у вас есть friends - поле для связи с отдельным преобразователем

xadm 02.06.2019 10:13

А как работает 2 резольвера под капотом в gqlgen? То есть, если есть users.friends поле и allUsers запрос, будет ли users_resolver инициализировать все поля, кроме .friends, а затем friends будет разрешаться отдельно его преобразователем? Я действительно не понимаю рабочий процесс, так как allUsers возвращает [Users], и мы не можем инициализировать поле users.friends.

James Larkin 02.06.2019 16:50

'engine' пытается собрать необходимые данные для всех полей - для каждого объекта (User) используются дополнительные распознаватели и каждое поле/свойство (не определено при запуске), не разрешенное распознавателем типа (на каждом уровне, сверху вниз) - возвращает null для не разрешенные поля (нет преобразователя полей, нет соответствующих данных и т. д.)

xadm 02.06.2019 17:01

Другие вопросы по теме