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 值,相同的值是 hitsbounces 的别名(这是有道理的,因为只有一个总和值甚至可以退货)。如果我让解析器在返回结果时使用别名作为字段名,hitsbounces 都会变成 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。只有 namesum.

您可以 return 对象数组 f.e。

{ stats: [
  { name:"hits", 
    sum:12345, 
    average: 456 }

这里可以使用别名来选择不同的数据集f.e。 namesum 用于 hitsbounces 另外还有 average.

...更具声明性?

PS。没有什么 "complicates integration for the front end devs"。结果是 json,需要时可以在获取(clinet 端)后 converted/transformed/adapted。