我应该一遍又一遍地重新输入我的字段,还是我认为这是错误的?

Am I supposed to re-type my fields over and over, or am I thinking though this wrong?

我有点想 Apollo/GraphQL/Prisma/瑜伽,但我总是卡住的一点是,有太多的加倍正在进行.

假设我有一个名为 Client 的模式类型,它有 titlefirstNamelastNameemailphoneaddress 等等等等

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

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

这然后转到我服务器中的解析器(感谢上帝提供了传播运算符),然后转到我的数据库架构,我基本上第四次键入所有相同的字段。

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

您可以尝试利用...

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

接口至少在类型未正确实现时应抛出错误,输入类型和片段应避免您重新输入(如果它们可以重用)。

# 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
      }
    }
}