【问题标题】:How do you define a fragment using graphql-js?如何使用 graphql-js 定义片段?
【发布时间】:2017-05-24 10:24:29
【问题描述】:

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

【问题讨论】:

    标签: javascript graphql graphql-js


    【解决方案1】:

    Fragments 用于对字段进行分组并在客户端重用它们。它们不是您在服务器上和在创建架构时应该担心的事情。

    从服务器查询数据时,客户端代码应提供片段。 GraphQL 本身负责在查询中添加碎片字段。在服务器上,您需要指定所有对象上的所有字段。

    当然你也可以编写自己的助手来减少手工工作。

    variables 也是如此。

    【讨论】:

    • 所以当我使用 GraphiQL 时,我只会在查询中添加片段吗?这就是我现在的动机。在测试服务器时,我厌倦了输入query { function(param) { x y z } }
    • @JosephFraley 你可以做的是有一个包含所需片段的字符串,在客户端硬编码。然后在您发送它们时将其附加到所有查询中。 GraphQL 核心非常小,如果您需要自定义行为,则必须围绕它编写一些帮助程序。
    【解决方案2】:

    您没有在架构中定义片段。您在进行查询时在 graphql 界面上定义。这是关于不要重复自己。

    我们可以在query{ } 中进行尽可能多的不同查询

    query {
       company(id:"1"){
        name
        description
      }
      company(id:"4"){
        name
        description
      }
    }
    

    如果你这样做,你会得到一个错误:字段“公司”冲突,因为它们有不同的参数。为了摆脱这种情况,我们可以在查询返回时通过在前面写出一些任意键来命名查询的结果。我们收到此错误的原因是响应对象将有 2 个嵌套对象,它们都将具有“公司”键值,但在 javascript 中,我们不能在对象上有重复键。

    {
      apple: company(id:"1"){
        name
        description
      }
      google: company(id:"4"){
        name
        description
      }
    }
    

    现在我们解决了这个问题。假设我们想在一个包含太多字段的查询对象中执行 100 个查询。这将是一个很大的头痛。所以我们定义片段

    fragment companyDetails on Company{  
      name
      description
      }
    

    请注意,我们必须指定on Company。它有助于 graphql 进行类型检查。 graphql 检查这些字段在公司下是否有效。最后这就是我们使用它的方式

    {
      apple: company(id:"1"){
        ...companyDetails
      }
      google: company(id:"4"){
        ...companyDetails
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-04
      • 2021-09-25
      • 2020-07-14
      • 2020-07-05
      • 2020-04-22
      • 2021-06-19
      • 2019-06-12
      • 2021-06-09
      • 1970-01-01
      相关资源
      最近更新 更多