如何使用graphql-js定义片段?

时间:2017-01-10 02:32:53

标签: javascript graphql graphql-js

如何使用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生成。什么函数生成片段?

2 个答案:

答案 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
  }
}