【问题标题】:Aliasing fields in Apollo GraphQL ServerApollo GraphQL Server 中的别名字段
【发布时间】:2020-04-08 23:02:47
【问题描述】:

别名非常方便,在为特定解析器设置别名时效果很好。例如:

{
  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(someFilter:"month") { hits, bounces } } ?
  • 这可能不是最好的例子,但重点是 sum 将根据计算返回单个值(例如,将已识别字段中的所有数字相加)。

标签: node.js graphql apollo apollo-server


【解决方案1】:

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

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

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

带有查询 - 预期结构

{
  stats {
    name
    sum
    average
  }
}

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

您可以返回对象 f.e. 的数组。

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

可以在这里使用别名来选择不同的数据集 f.e. namesum 用于 hitsbounces 以及 average

...更具声明性?

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

【讨论】:

  • “complicates integration”评论是关于我们应用程序的前端当前如何构建查询的,这意味着一个很大的变化。当然,这并不意味着它不值得。只是如果可能的话,最好避免它。我确实认为这需要对我们的设置进行最少的侵入性更改。感谢您的帮助!
【解决方案2】:

听起来您将所有逻辑都放在根级解析器 (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 解析器将针对每个别名使用特定于该别名的参数单独调用,因此每个别名都会相应地解析。

【讨论】:

  • 谢谢!我是否认为这意味着查询看起来像hits: SiteStats { sum }, bounces: SiteStats { sum }?这意味着我们必须对我们的数据源进行多个后端查询,对吗?每个别名一个?
  • 您可以将别名应用于根字段,但您也可以将别名应用于sum,如原始帖子所示。也就是说,将别名应用于根将解决您的问题,而无需对解析器进行额外更改。
  • 这样做是否会导致对数据源的多次查询完全取决于您的解析器代码。
猜你喜欢
  • 1970-01-01
  • 2018-10-04
  • 2020-02-23
  • 2017-05-24
  • 2020-05-05
  • 2021-10-18
  • 2019-09-01
  • 2019-07-26
  • 2021-01-10
相关资源
最近更新 更多