如何使用graphql-js在我的架构中定义片段?
import graphql from 'graphql'
/* how do I do this?
fragment authorInfo on Author {
name
}
*/
例如,要定义作者类型我会:
import graphql from 'graphql'
export default new graphql.GraphQLObjectType({
description: `An author`,
name: {
description: `The author's legal name.`,
type: GraphQLString
}
}),
name: `Author`
})
因此,此处的类型定义由GraphQLObjecType
生成。什么函数生成片段?
答案 0 :(得分:4)
Fragments用于对字段进行分组,并在客户端重用它们。在服务器上以及创建模式时,它们不是您应该担心的。
客户端代码应在从服务器查询数据时提供片段。 GraphQL本身负责在查询中添加碎片字段。在服务器上,您需要指定所有对象上的所有字段。
当然,您可以编写自己的助手来减少手动工作。
同样适用于variables。
答案 1 :(得分:0)
您未在架构中定义片段。您在查询时在graphql接口上定义。这是关于不要重复自己。
我们可以在query{ }
query {
company(id:"1"){
name
description
}
company(id:"4"){
name
description
}
}
如果这样做,将出现错误:字段“ company”冲突,因为它们具有不同的参数。为了消除这种情况,我们可以通过在前面写一些任意键来命名查询返回时的结果。我们收到此错误的原因是响应对象将具有2个嵌套对象,并且它们都具有“ company”键值,但是在javascript中,我们不能在对象上具有重复键。
{
apple: company(id:"1"){
name
description
}
google: company(id:"4"){
name
description
}
}
现在我们解决了这个问题。想象一下,我们想在一个具有太多字段的查询对象中进行100个查询。这将是一个很大的头痛。所以我们定义片段
fragment companyDetails on Company{
name
description
}
请注意,我们必须指定on Company
。它有助于graphql进行类型检查。 graphql检查这些字段在company下是否有效。最后,这就是我们的使用方式
{
apple: company(id:"1"){
...companyDetails
}
google: company(id:"4"){
...companyDetails
}
}