对每个突变使用GraphQL输入是个问题吗



我正在开发一个应用程序,该应用程序具有相当多的查询和突变。数据的结构通常并不复杂,但有很多,所以我给自己做了一个片段,生成了在其中重复的最常见的东西。该片段还生成突变的输入,因此可以用于简单和复杂的数据结构。在相当多的实例中,输入只是用于添加名称。API应该主要由我的前台使用,但在应用程序足够成熟后,应该可以公开使用。从惯例的角度来看,这样做是个问题吗?

的样本

/*=============================================
Types
=============================================*/
interface AddSampleSchemaInput {
input: AddSampleSchema
}
interface AddSampleSchema {
name: string
}
/*=============================================
Main
=============================================*/
export const SampleSchemaModule = {
typeDefs: gql`
type Mutation {
addSampleSchema(input: AddSampleSchemaInput): SampleSchema!
}
type SampleSchema {
_id: ID!
name: String!
}
input AddSampleSchemaInput {
name: String!
}
`
,
resolvers: {
Mutation: {
addSampleSchema: async (parents: any, args: AddSampleSchemaInput, context: GraphqlContext) => {
}
}
}
}

我认为它应该是什么样的样品。

/*=============================================
Main
=============================================*/
export const SampleSchemaModule = {
typeDefs: gql`
type Mutation {
addSampleSchema(name: String): SampleSchema!
}
type SampleSchema {
_id: ID!
name: String!
}
`
,
resolvers: {
Mutation: {
addSampleSchema: async (parents: any, args: { name: string }, context: GraphqlContext) => {
}
}
}
}
export default SampleSchemaModule

使用第一个代码示例会有问题吗。这意味着使用输入(input AddSampleSchemaInput(,即使它只包含一个值(在本例中为名称(。

或者换句话说,就是对每一个突变都使用输入——无论问题多么复杂。

或者对前端的影响:

addDogBreed({
variables: {
input: { 
name: "Retriever",
avergeHeight: 0.65
}
}
})
addDog({
variables: {
input: { 
name: "Charlie"
}
}
})
// ======= VS =======
addDogBreed({
variables: {
input: { 
name: "Retriever",
avergeHeight: 0.65
}
}
})
addDog({
variables: {
name: "Charlie"
}
})

在这种情况下,用第一个而不是第二个是问题吗?

输入只包含一个键是否有问题?

不,相反,它在GraphQL中是可取的。虽然嵌套有时看起来是多余的,但它是模式向前兼容性和可扩展性的关键。对于如何根据输入的数量设计突变参数,您不应该有不同的约定。如果始终使用输入对象,则可以轻松地弃用现有字段或添加新的可选字段,并与所有现有客户端保持兼容。如果仅仅因为一个对象只有一个键,就完全改变了突变参数的形状,这将破坏兼容性。

我没有发现会让你进入的问题

"仅在处理获取/获取数据时使用GraphQL,并且正常REST API请求更改数据(创建、更新、删除(">

就像@Bergi说的那样。此外,您可以为您的实体提供多个变体,其中一些可以像PATCH或PUT请求一样工作。

最新更新