Apollo GraphQL Server 中的别名字段
Aliasing fields in Apollo GraphQL Server
别名非常方便,在为特定解析器设置别名时效果很好。例如:
{
admins: users(type:"admin"){
username
}
moderators: users(type:"moderators"){
moderators
}
}
不过我不确定如何处理字段本身的别名。例如:
{
site_stats {
hits: sum(field: "hits")
bounces: sum(field: "bounces")
}
}
如果解析器 returns 任何 sum
值,相同的值是 hits
和 bounces
的别名(这是有道理的,因为只有一个总和值甚至可以退货)。如果我让解析器在返回结果时使用别名作为字段名,hits
和 bounces
都会变成 null
.
我可以简单地将这些字段分解为单独的解析器,但这会使前端开发人员的集成变得复杂。我们也会失去大量的效率优势,因为我可以将单个查询中所需的所有数据聚合到我们的数据源(我们正在使用 ElasticSearch)。
非常感谢各位天才的帮助!
听起来您将所有逻辑都放在根级解析器 (site_stats
) 中,而不是为 sum
字段提供解析器。换句话说,如果您的解析器如下所示:
const resolvers = {
Query: {
site_stats: () => {
...
return { sum: someValue }
},
},
}
您应该改为执行以下操作:
const resolvers = {
Query: {
site_stats: () => {
return {} // empty object
},
},
SiteStats: {
sum: () => {
...
return someValue
},
},
}
这样您就不会从父级传递 sum 的值并依赖于默认解析器——您是在其解析器中明确提供 sum
的值。由于 sum
解析器将针对每个别名使用特定于该别名的参数单独调用,因此每个别名都将相应地解析。
使用别名和单一字段的可用性非常有限。
您可以使用复杂的过滤器(输入参数),f.e。要 returned 的键列表及其相关参数,f.e。
[{name:"hits", range:"month"},
{name:"bounces", range:"year"}]
有查询 - 预期结构
{
stats {
name
sum
average
}
}
必填字段可能会有所不同,f.e。只有 name
和 sum
.
您可以 return 对象数组 f.e。
{ stats: [
{ name:"hits",
sum:12345,
average: 456 }
这里可以使用别名来选择不同的数据集f.e。 name
和 sum
用于 hits
,bounces
另外还有 average
.
...更具声明性?
PS。没有什么 "complicates integration for the front end devs"。结果是 json,需要时可以在获取(clinet 端)后 converted/transformed/adapted。
别名非常方便,在为特定解析器设置别名时效果很好。例如:
{
admins: users(type:"admin"){
username
}
moderators: users(type:"moderators"){
moderators
}
}
不过我不确定如何处理字段本身的别名。例如:
{
site_stats {
hits: sum(field: "hits")
bounces: sum(field: "bounces")
}
}
如果解析器 returns 任何 sum
值,相同的值是 hits
和 bounces
的别名(这是有道理的,因为只有一个总和值甚至可以退货)。如果我让解析器在返回结果时使用别名作为字段名,hits
和 bounces
都会变成 null
.
我可以简单地将这些字段分解为单独的解析器,但这会使前端开发人员的集成变得复杂。我们也会失去大量的效率优势,因为我可以将单个查询中所需的所有数据聚合到我们的数据源(我们正在使用 ElasticSearch)。
非常感谢各位天才的帮助!
听起来您将所有逻辑都放在根级解析器 (site_stats
) 中,而不是为 sum
字段提供解析器。换句话说,如果您的解析器如下所示:
const resolvers = {
Query: {
site_stats: () => {
...
return { sum: someValue }
},
},
}
您应该改为执行以下操作:
const resolvers = {
Query: {
site_stats: () => {
return {} // empty object
},
},
SiteStats: {
sum: () => {
...
return someValue
},
},
}
这样您就不会从父级传递 sum 的值并依赖于默认解析器——您是在其解析器中明确提供 sum
的值。由于 sum
解析器将针对每个别名使用特定于该别名的参数单独调用,因此每个别名都将相应地解析。
使用别名和单一字段的可用性非常有限。
您可以使用复杂的过滤器(输入参数),f.e。要 returned 的键列表及其相关参数,f.e。
[{name:"hits", range:"month"},
{name:"bounces", range:"year"}]
有查询 - 预期结构
{
stats {
name
sum
average
}
}
必填字段可能会有所不同,f.e。只有 name
和 sum
.
您可以 return 对象数组 f.e。
{ stats: [
{ name:"hits",
sum:12345,
average: 456 }
这里可以使用别名来选择不同的数据集f.e。 name
和 sum
用于 hits
,bounces
另外还有 average
.
...更具声明性?
PS。没有什么 "complicates integration for the front end devs"。结果是 json,需要时可以在获取(clinet 端)后 converted/transformed/adapted。