在 GraphQL 中,如何 "aggregate" 属性

In GraphQL, how to "aggregate" properties

请原谅模糊的代码,我真的不会copy/paste。 :)

我像这样输入 GraphQL:

type Thing {
    toBe: Boolean
    orNot: Boolean
}

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

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

这有意义吗?所以它会 return 类似于:

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

各种 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";
    }
  }
};

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

Example in 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!"; }
    }
  }
});

Example in 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!"
      })
    )
  )