gpt4 book ai didi

GraphQL:如何重用相同类型进行查询和突变?

转载 作者:行者123 更新时间:2023-12-02 12:11:03 26 4
gpt4 key购买 nike

假设我有一个这样定义的查询:

type Query {
# The basic me query
getUser(id:Int): [User]
}

type User {
id: ID!
login: String!
name: String
}

但现在我需要进行突变才能添加用户。我的直觉是这样的:

type Mutation {  
addUser(newUser: User): [User]
}

但它不起作用,因为突变不能使用“查询类型”。它需要使用“输入类型”。我知道在这个例子中,做起来并不复杂,但是如果用户是一个非常复杂的类型,并且使用了许多子类型。我怎样才能做到这一点?是否可以重新使用类型作为突变参数?

最佳答案

不幸的是,type不能用来代替 input ,以及 input不能用来代替 type 。这是设计使然。来自 official specification :

Fields can define arguments that the client passes up with the query, to configure their behavior. These inputs can be Strings or Enums, but they sometimes need to be more complex than this.

The Object type defined above is inappropriate for re‐use here, because Objects can contain fields that express circular references or references to interfaces and unions, neither of which is appropriate for use as an input argument. For this reason, input objects have a separate type in the system.

此外,GraphQLObjectType 上的字段可以有 args 和一个解析函数,而 GraphQLInputObjectType 上的那些不这样做(但它们确实有默认值,前者不可用)。

从实现的角度来看,将它们分开也是有意义的。简单的模式可能只是将字段映射到某个表中的列。但是,在实际应用程序中,您更有可能拥有不映射到任何一列的派生字段(并且不适合在输入内部使用)。

您也可能只希望某些字段用作输入(例如,如果您要添加用户,客户端不应向您发送 ID;这可能应该添加用户时由数据库生成)。同样,您可能不想公开用作客户端输入的每个字段,而只公开他们实际需要的字段。

如果不出意外,您对 non-null 的使用输入类型和返回类型之间可能会有所不同。

也就是说,有一种解决方法。至少在 graphql-js 中是这样。如果您以编程方式声明架构,则可以使用您的字段集单独定义一个对象,然后设置 fields您的属性(property) UserUserInput对象。或者,如果您以声明方式定义架构(如示例中所示),则可以使用如下模板文字:

const userFields = `
id: ID!
login: String!
name: String
`
const schema = `
type User {
${userFields}
}
type UserInput {
${userFields}
}
`

哎呀,如果您愿意,您甚至可以迭代每个定义的类型并以编程方式创建匹配的输入类型。然而,在我看来,当考虑到灵 active 成本时,实现任何这些解决方法的努力可能都不值得。咬紧牙关,考虑一下您实际需要什么作为该突变的输入,并仅指定您需要的字段。

关于GraphQL:如何重用相同类型进行查询和突变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46158288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com