3

我对 Apollo/GraphQL/ Prisma /Yoga 有点了解,但我总是卡住的一点是,有这么多的加倍发生。

假设我有一个名为Client, title, firstName, lastName,email等的模式类型phoneaddress

当我进行突变时,我需要输入所有字段:

const result = await this.props.saveClientMutation({
  variables: {
    title,
    firstName,
    lastName,
    email,
    (etc)
  }
})

然后转到我在客户端中的实际 graphQL 定义,在那里我再次输入所有字段(两次!)

mutation SAVE_CLIENT_MUTATION ($title: String!, $firstName: String!, $lastName: String!, $email: String!) {
  login(title: $title, firstName: $firstName, lastName: $lastName, email: $email) {
    client {
      id
      firstName
      lastName
    }
  }
}

然后它进入我服务器中的解析器(感谢上帝的传播运算符),然后进入我的数据库模式,在那里我基本上第四次键入所有相同的字段。

这似乎是错误和不一致的巨大表面积。我是否完全误解了这是如何工作的,或者是否意味着要进行如此疯狂的重新输入?

4

1 回答 1

2

你可以尝试使用...

  • 定义具有共享字段的类型的接口
  • 具有共享字段的突变的输入类型
  • 具有共享字段的查询片段

...但据我所知,您仍然需要重新输入很多字段

如果类型没有正确实现接口,至少应该抛出错误,输入类型和片段应该为您节省一些重新输入(如果它们可以重用)。

# Reusable type fields
interface IClient {
    title: String
    firstName: String
    lastName: String
    email: String
    phone: String
    address: String
}

type Client implements IClient {
    # You must re-type interface items
    title: String
    firstName: String
    lastName: String
    email: String
    phone: String
    address: String
}

# Reusable mutation input variables
input ClientInput {
    title: String
    firstName: String
    lastName: String
    email: String
    phone: String
    address: String
}

# Reusable query fields
fragment ClientParts on Client {
  firstName
  lastName
}

# You can use your input type & fragment here
# although the input does change the structure from your example
mutation SAVE_CLIENT_MUTATION ($input: ClientInput!) {
    login(input: $input) {
      client {
        ...ClientParts
        id
      }
    }
}
于 2018-07-24T11:34:00.410 回答