苦艾酒的结果都是空值



我对长生不老药、凤凰和苦艾酒完全陌生。。。所以对我宽容一点。:(

我正在试验一个名为Dgraph的图形数据库,该数据库使用一个称为Dlex的库。我写了一个简单的查询,旨在查找并返回用户列表(目前我只有两个用户(:

def list_users() do
query = """
{
users(func: type(User)) {
uid
email
name
}
}
"""
{:ok, %{"users" => result}} = Dlex.query(:dlex, query)
IO.inspect(result)
{:ok, result}
end

IO.inspect(result)的输出正是我所期望和想要的——我的两个用户的列表:

[
%{"email" => "rob@example.com", "name" => "Rob", "uid" => "0x1"},
%{"email" => "bridget@example.com", "name" => "Bridget", "uid" => "0x2"}
]

然而,当我使用GraphiQL运行此查询时,由于某种原因,结果中的所有值都是null

{
"data": {
"users": [
{
"email": null,
"name": null,
"uid": null
},
{
"email": null,
"name": null,
"uid": null
}
]
}
}

知道我做错了什么吗?

在我看来,您可以在用户解析程序中返回适当的数据,但有一个例外:当Absinin解析每个用户的字段时,默认解析程序只将字段作为原子键查找。当在父映射中找不到:uid:email:name时,返回nil

您可以将结果转换为将原子作为关键帧。如果你想走这条路,一个选择就是在每个用户身上绘制地图,并明确复制你想要的东西。

users = Enum.map(users, &%{uid: &1["uid"], email: &1["email"], name: &1["name"]})

不过,这是添加关键点时需要更新的另一个地方。很多尝试更动态的解决方案都没有遵循最佳实践(他们打开应用程序,在运行时创建新的原子,这是个坏主意,或者当他们看到无法识别的密钥时会抛出错误(。

我过去使用过的一个解决方案是创建自己的默认MapGet中间件,该中间件检查原子键和字符串键。

defmodule MyAppWeb.GraphQL.Middleware.MapGet do
@moduledoc """
Default resolver that checks for both atom and string keys.
"""
@behaviour Absinthe.Middleware
@impl Absinthe.Middleware
def call(%{source: source} = info, key) do
value =
with :error <- Map.fetch(source, key),
:error <- Map.fetch(source, to_string(key)) do
nil
else
{:ok, value} ->
value
end
%{info | state: :resolved, value: value}
end
end

Absinin文档描述了交换掉默认的中间件。在我的应用程序中,它非常简单。

defmodule MyAppWeb.GraphQL.Schema do
use Absinthe.Schema
# ...
def middleware(middleware, field, object) do
map_get = {{MyAppWeb.GraphQL.Middleware.MapGet, :call}, field.identifier}
Absinthe.Schema.replace_default(middleware, map_get, field, object)
end
# ...
end

最新更新