Создание поля GraphQL без резольвера - PullRequest
0 голосов
/ 10 мая 2019

Я использую Elixir с Phoenix и Absinthe для настройки бэкэнда GraphQL.

В идеале, я хотел бы иметь структуру, которая выглядит следующим образом:

{
  posts {
    published {
      title
    }
    draft {
      title
    }
  }
}

Для этого я подумал, что мне нужно будет делегировать поле posts в моей схеме объекту, который отвечает на published и draft. Я сделал это так:

# In my Schema
field :posts, type: :posts_by_state

# In my Post type definitions
object :post do
  # ...
end

object :posts_by_state do
  field :published, list_of(:post) do
    resolve fn _, _, _ -> ... end
  end

  field :draft, list_of(:post) do
    resolve fn _, _, _ -> ... end
  end
end

Это не сработало и вместо этого возвращает null для всего поля posts. Однако если я изменил поле posts в схеме, добавив в него «пустой» преобразователь, он работал бы так, как ожидалось:

field :posts, type: :posts_by_state do
  resolve fn _, _, _ -> {:ok, []} end
end

Это лучшая практика или есть лучший способ указать, что поле должно полностью делегироваться объекту? В целом, есть ли лучший способ структурировать это?

1 Ответ

0 голосов
/ 16 мая 2019

Этот ответ был предоставлен benwilson512 на форумах Elixir. Публикация здесь, чтобы поделиться ответом


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

field :posts, type: :posts_by_state do
  resolve fn _, _, _ -> {:ok, %{}} end
end

Если вы не укажете распознаватель, Absinthe будет использовать преобразователь по умолчанию, который делает Map.get(parent_value, field_name). В вашем случае, если корневое значение равно %{} (что по умолчанию), то если вы не указали преобразователь поля сообщений, то Absinthe делает Map.get(%{}, :posts), что, конечно, возвращает nil. Поскольку поле возвращает nil, никакие подполя не выполняются.

На самом деле, это похоже на вещи, которые должны быть аргументами IE:

{
  published: posts(status: PUBLISHED) { title }
  draft: posts(status: DRAFT) { title }
}
...