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/3returns{: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, []}。我想写一个问题确实有助于理清你的想法。