Absinthe returns 包含一个空值而不是空数组的数组
Absinthe returns an array that contains one null value instead of an empty array
我对 Absinthe 的这种行为感到困惑。
对于顶级字段,例如
field :projects, list_of(:project) do
arg :user_id, :string
resolve(&ProjectResolver.list_projects/2)
end
如果ProjectResolver.list_projects/2
returns {:ok, []}
,则JSON结果将正确为
{
"data": {
"projects": []
}
}
但是,对于子字段,例如
中的 tags
字段
object :task do
field :id, :string
# ... Other fields
field :tags, list_of(:tag) do
resolve(&TaskResolver.list_tags/3)
end
# ... Other subfields
end
如果TaskResolver.list_tags/3
returns{:ok, []}
,我得到
{
"data": {
"task": {
"id": "ba156cde-8c5f-4806-b161-62071b0098b3",
"tags": [
null
]
}
}
}
而不是
{
"data": {
"task": {
"id": "ba156cde-8c5f-4806-b161-62071b0098b3",
"tags": []
}
}
}
我认为应该是合理的回应。
现在,包含一项 (null
) 的非空数组让我在前端 (apollo) 很头疼,我不确定是否有任何方法可以轻松解决这个问题.如果返回的数据首先是一个空数组,那将是理想的,但我不明白为什么不是。
发布这个问题后,我立即意识到我的解析器很可能根本没有 returning {:ok, []}
...确实,它 returning {:ok [nil]}
由于 Ecto 查询错误(:left_join
而不是 :join
)。这就是 returned JSON 包含 [null]
的原因。在这种情况下,我只需要将我的解析器函数修复为 return {:ok, []}
。我想写一个问题确实有助于理清你的想法。
我对 Absinthe 的这种行为感到困惑。
对于顶级字段,例如
field :projects, list_of(:project) do
arg :user_id, :string
resolve(&ProjectResolver.list_projects/2)
end
如果ProjectResolver.list_projects/2
returns {:ok, []}
,则JSON结果将正确为
{
"data": {
"projects": []
}
}
但是,对于子字段,例如
中的tags
字段
object :task do
field :id, :string
# ... Other fields
field :tags, list_of(:tag) do
resolve(&TaskResolver.list_tags/3)
end
# ... Other subfields
end
如果TaskResolver.list_tags/3
returns{:ok, []}
,我得到
{
"data": {
"task": {
"id": "ba156cde-8c5f-4806-b161-62071b0098b3",
"tags": [
null
]
}
}
}
而不是
{
"data": {
"task": {
"id": "ba156cde-8c5f-4806-b161-62071b0098b3",
"tags": []
}
}
}
我认为应该是合理的回应。
现在,包含一项 (null
) 的非空数组让我在前端 (apollo) 很头疼,我不确定是否有任何方法可以轻松解决这个问题.如果返回的数据首先是一个空数组,那将是理想的,但我不明白为什么不是。
发布这个问题后,我立即意识到我的解析器很可能根本没有 returning {:ok, []}
...确实,它 returning {:ok [nil]}
由于 Ecto 查询错误(:left_join
而不是 :join
)。这就是 returned JSON 包含 [null]
的原因。在这种情况下,我只需要将我的解析器函数修复为 return {:ok, []}
。我想写一个问题确实有助于理清你的想法。