创建不带解析器的GraphQL字段

时间:2019-05-10 16:57:21

标签: elixir graphql phoenix-framework absinthe

我将Elixir与Phoenix和Absinthe一起使用来建立GraphQL后端。

理想情况下,我想要一个看起来像这样的结构:

['Issaquah', 'Wilsonville']

为此,我认为我需要将架构中的{ posts { published { title } draft { title } } } 字段委派给响应postspublished的对象。我这样做是这样的:

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

这是最佳实践,还是有更好的方法来告诉字段将其完全委派给对象?更笼统地说,有没有更好的方法来构造它?

1 个答案:

答案 0 :(得分:0)

此答案由benwilson512在Elixir论坛上提供。在此处发布分享答案


尽管通常使用的虚拟解析器为:

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

如果您未指定解析器,则苦艾酒将使用默认的解析器,该解析器会执行Map.get(parent_value, field_name)。在您的情况下,如果根值为%{}(默认情况下为默认值),那么如果您未指定发布字段解析器Absinthe会进行Map.get(%{}, :posts),则当然返回nil。由于该字段返回nil,因此不会执行任何子字段。

虽然,实际上,这些看起来更像应该作为IE的参数:

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