不好意思的代码,我真的不能复制/粘贴。 :)
我这样输入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!"
}
答案 0 :(得分:2)
是的,您可以通过处理聚合字段Object types
中所需的逻辑,轻松地在graphql resolver
中创建聚合字段。在创建对象类型时,您拥有该对象的实例,因此,您可以使用对象的数据轻松创建汇总字段,这些字段在域模型中不存在,并且 这是其中之一graphql的美丽 。请注意,这在GraphQL库的每种实现上可能有所不同。以下是JavaScript
和Scala
中此类用例的示例。
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!"
})
)
)
答案 1 :(得分:0)
各种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";
}
}
};