在 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 库的每个实现而异。以下是 JavaScript
和 Scala
中此类用例的示例。
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!"
})
)
)
请原谅模糊的代码,我真的不会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 库的每个实现而异。以下是 JavaScript
和 Scala
中此类用例的示例。
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!"
})
)
)