我将Elixir与Phoenix和Absinthe一起使用来建立GraphQL后端。
理想情况下,我想要一个看起来像这样的结构:
['Issaquah', 'Wilsonville']
为此,我认为我需要将架构中的{
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
这是最佳实践,还是有更好的方法来告诉字段将其完全委派给对象?更笼统地说,有没有更好的方法来构造它?
答案 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 }
}