如何在架构中实现GraphQL片段?

时间:2019-01-29 01:12:40

标签: graphql graphql-js

我尝试在fragments中使用GraphQL

有我的schema

user / getUser.gql

input GetUserByUsernameInput {
  username: String!
}

fragment UserFragment on User {
  username
  information
  pictureUrl
}

type UserType {
  ...UserFragment
}

type GetUserByUsernameResponse {
  user: UserType
  errors: [Error]!
}

type Query {
  getUserByUsername(input: GetUserByUsernameInput!): GetUserByUsernameResponse!
}

共享的/User.gql

type User {
  id: Int!
  username: String!
  email: String!
  information: String
  pictureUrl: String
}

我得到了虚拟错误

(node:26206) UnhandledPromiseRejectionWarning: Syntax Error: Expected Name, found ...

GraphQL request (12:9)
11: type UserType {
12:   user: ...UserFragment
            ^
13: }

我的代码应该如何使用GraphQL fragments

PS。我使用graphql-code-generator

1 个答案:

答案 0 :(得分:2)

片段仅存在于查询中;您不能在架构语言中使用它们。

在您的示例中,响应应包括对返回的User的引用:

type GetUserByUsernameResponse {
  user: User
  errors: [Error]!
}

但是,当您进行查询时,您可以包含该片段。

query WhoAreYou($username: String!) {
  getUserByUsername(input: {username: $username}) {
    user { ...UserFragment }
    errors { message }
  }
}

fragment UserFragment on User {
  username
  information
  pictureUrl
}

如果您有理由在一个查询中多次请求相同类型的对象上的相同字段,或者如果您的客户端库能够从“库”中挑选片段,则片段往往会更有用。 GraphQL查询中,您将使用多个位置。 (例如,可以为Ruby graphql-client gem配置一个包含许多查询的文件,您可以根据操作名称在其中进行特定的查询,并且它将对该操作及其引用的任何片段进行查询,因此您可以在多个查询中重复使用相同的片段。)