【问题标题】:In GraphQL, how to "aggregate" properties在 GraphQL 中,如何“聚合”属性
【发布时间】:2019-03-07 04:32:04
【问题描述】:

请原谅模糊的代码,我不能真正复制/粘贴。 :)

我有这样的 GraphQL 类型:

type Thing {
    toBe: Boolean
    orNot: Boolean
}

我正在尝试在这种类型上创建一个新属性,它是...这两者的集合。基本上根据这些值返回一个新值。代码如下:

if (this.toBe && !this.orNot) { return "To be!"; }
if (!this.toBe && !this.orNot) { return "OrNot!"; }

这有意义吗?所以它会返回类似:

Thing1 {
    toBe: true;
    orNot: false;
    newProp: "To be!"
}

【问题讨论】:

  • 您可以定义两个一个用于输入input,只有两个字段,另一个用于type 输出。

标签: graphql apollo


【解决方案1】:

是的,您可以通过在聚合字段 resolver 中处理所需的逻辑,轻松地在您的 graphql Object types 中创建聚合字段。在创建对象类型时,您拥有该对象的实例,因此,您可以使用对象的数据轻松创建域模型中不存在的聚合字段这是其中之一graphql 的美丽。请注意,这可能因 GraphQL 库的每个实现而异。以下是JavaScriptScala 中此类用例的示例。

Graphql.js 中的示例:

var FooType = new GraphQLObjectType({
  name: 'Foo',
  fields: {
    toBe: { type: GraphQLBoolean},
    orNot: { type: GraphQLBoolean},
    newProp: { type: GraphQLString,
    resolve(obj) {
        if (obj.toBe && !obj.orNot) { return "To be!"; }
        else { return "OrNot!"; }
    }
  }
});

Sangria-graphql 中的示例:

ObjectType(
    "Foo",
    "graphql object type for foo",
    fields[Unit, Foo](
      Field("toBe",BooleanType,resolve = _.value.name),
      Field("orNot",BooleanType,resolve = _.value.path),
      Field("newProp",StringType,resolve = c => {
          if (c.value.toBe && !c.value.orNot) "To be!" else "OrNot!"
      })
    )
  )

【讨论】:

    【解决方案2】:

    各种 GraphQL 服务器库实现都有办法提供解析器函数,这些函数可以为字段提供值。您必须将其包含在您的架构中并为其编写代码,但这是合理的做法,您引用的代码是一个很好的起点。

    特别是在 Apollo 中,您 pass a map of resolvers 将作为 resolvers: 选项传递给 ApolloServer 构造函数。如果一个字段没有解析器,它将默认从原生 JavaScript 对象返回相关字段。所以你可以写

    const resolvers = {
      Thing: {
        newProp: (parent) => {
          if (parent.toBe && !parent.orNot) { return "To be!"; }
          if (!parent.toBe && !parent.orNot) { return "OrNot!"; }
          return "That is the question";
        }
      }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 2020-04-14
      • 1970-01-01
      相关资源
      最近更新 更多