在GraphQL

时间:2018-09-22 02:27:07

标签: types graphql

在GraphQL中,一个非常常见的用例是创建一个带有突变的对象,并接收返回的完全相同的字段以及数据库返回的ID和ID。这是与此相关的question的问题。

我的问题是,如何简化此模式以避免重复字段?我尝试将输入类型重新用作片段,

input ClientInput {
  short_name: String
  full_name: String
  address: String
  email: String
  location: String  
}

type Client {
  id: String
  ...ClientInput
}

...但是失败了

  

语法错误:预期名称,找到...

我在Fragments上看到的所有documentation和博客文章始终将它们on创建为现有类型。这意味着除了ID字段外,其余所有重复:

type Client {
  _id: String
  short_name: String
  full_name: String
  address: String
  email: String
  location: String
}

fragment ClientFields on Client {
  short_name: String
  full_name: String
  address: String
  email: String
  location: String
}

input ClientInput {
  ...ClientFields
}

有什么更好的方法吗?

1 个答案:

答案 0 :(得分:3)

片段旨在在组成查询时在客户端使用。根据规格:

  

片段允许重复使用常见的字段选择,从而减少了文档中的重复文本。

片段背后的目的是,您可以有任意数量的保存的查询来查询同一类型-如果架构发生更改,或者您决定不需要某个特定的查询,则不需要更新20个不同的查询领域。

尚不存在允许字段在Type和Input Type服务器端之间共享的类似机制。这在很大程度上可能是设计使然,因为即使Type字段和Input Type字段都具有某种type,它们也可能具有其他属性。例如,“输入类型”字段可以具有默认值,而“类型”字段不存在该属性。同样,“类型”字段具有解析器和参数,而“输入类型”字段则没有。

如果您真的想让其保持干燥,则可能有解决方法,具体取决于您所运行的GraphQL服务器类型。例如,如果它是使用从一个或多个SDL字符串创建的架构的GraphQL.js服务器,则可以仅使用模板文字:

const sharedClientFields = `
    short_name: String
    full_name: String
    address: String
    email: String
    location: String 
`
const schema = `
  type Client {
    _id: String
    ${sharedClientFields}
  }

  type ClientInput {
    ${sharedClientFields}
  }
`