繁体   English   中英

Apollo GraphQL 服务器中的别名字段

[英]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")
  }
}

如果解析器返回任何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解析器,并且 arguments 特定于该别名,因此每个别名将相应地解析。

使用别名和单个字段的可用性非常有限。

您可以使用复杂的过滤器(输入参数),fe 要返回的键列表及其相关参数,fe

[{name:"hits", range:"month"}, 
{name:"bounces", range:"year"}]

带查询 - 预期结构

{
  stats {
    name
    sum
    average
  }
}

必填字段可能会有所不同,只有namesum

您可以返回 object fe 的 arrays

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

别名可以在这里用来选择不同的数据集 fe namesum for hits ,还加上average bounces

...更具声明性?

PS。 没有什么“使前端开发人员的集成变得复杂”。 结果是 json,可以在需要时在获取(clinet 端)后进行转换/转换/适配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM