我有点想了解 Apollo/GraphQL/Prisma/ Yaga ,但我总是被困住的一点是,有太多的双重 Action 在进行。
假设我有一个名为 Client
的模式类型,它有 title
、firstName
、lastName
、电子邮件
、电话
、地址
等。
当我进行突变时,我需要输入所有字段:
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
}
}
}
然后这会转到我服务器中的解析器(感谢上帝提供了传播运算符),然后转到我的数据库架构,我基本上在其中第四次键入所有相同的字段。
这看起来像是一个巨大的错误和不一致的表面区域。我是否完全误解了这是如何工作的,还是意味着要进行如此疯狂的重新输入?
最佳答案
你可以尝试利用...
- interfaces定义具有共享字段的类型
- input types对于具有共享字段的突变
- fragments对于具有共享字段的查询
...但据我所知,您仍然需要重新输入很多字段
接口(interface)至少在类型未正确实现时应抛出错误,输入类型和片段应避免您重新输入(如果它们可以重用)。
# 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
}
}
}
关于graphql - 我应该一遍又一遍地重新输入我的字段,还是我认为这是错误的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51497073/