- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您能否解释一下为什么如果突变的输入参数是对象,那么它应该是输入类型?我认为简单得多,只需重用 type 而不提供 id。
例如:
type Sample {
id: String
name: String
}
input SampleInput {
name: String
}
type RootMutation {
addSample(sample: Sample): Sample # <-- instead of it should be
addSample(sample: SampleInput): Sample
}
对于小对象来说还可以,但是当架构中有大量具有 10 多个属性的对象时,这将成为一种负担。
最佳答案
来自规范:
The GraphQL Object type (ObjectTypeDefinition)... is inappropriate for re‐use [as an input], because Object types can contain fields that define arguments or contain 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.
这是“官方原因”,但是有几个实际原因导致您不能使用对象类型作为输入对象类型或使用对象类型作为输入对象类型:
对象类型和输入对象类型都具有字段,但是这些字段具有不同的属性,反射(reflect)架构如何使用这些类型。您的模式可能会为对象类型的字段定义参数和某种解析器函数,但这些属性在输入上下文中没有意义(即您无法解析输入对象的字段 -它已经有一个明确的值)。同样,只能为输入对象类型字段提供默认值,而不能为对象类型字段提供默认值。
换句话说,这可能看起来像是重复:
type Student {
name: String
grade: Grade
}
input StudentInput {
name: String
grade: Grade
}
但是添加特定于对象类型或输入对象类型的功能可以清楚地表明它们的行为不同:
type Student {
name(preferred: Boolean): String
grade: Grade
}
input StudentInput {
name: String
grade: Grade = F
}
GraphQL 中的类型分为输出类型和输入类型。
输出类型是可以作为 GraphQL 服务生成的响应的一部分返回的类型。输入类型是字段或指令参数的有效输入的类型。
这两组之间存在重叠(即标量、枚举、列表和非空值)。但是,诸如联合和接口(interface)之类的抽象类型在输入上下文中没有意义,并且不能用作输入。将对象类型和输入对象类型分开可以确保在需要输入类型的地方永远不会使用抽象类型。
当在架构中表示实体时,某些实体可能确实会在各自的输入和输出类型之间“共享字段”:
type Student {
firstName: String
lastName: String
grade: Grade
}
input StudentInput {
firstName: String
lastName: String
grade: Grade
}
但是,对象类型可以(并且实际上经常这样做)对非常复杂的数据结构进行建模:
type Student {
fullName: String!
classes: [Class!]!
address: Address!
emergencyContact: Contact
# etc
}
虽然这些结构可能转换为适当的输入(我们创建一个学生,因此我们还传入一个代表他们地址的对象),但通常它们不会 - 即,也许我们需要指定学生的类 ID 和节 ID,而不是对象。同样,我们可能有一些想要返回但不想改变的字段,反之亦然(例如 password
字段)。
此外,即使对于相对简单的实体,我们也经常对对象类型及其“对应”输入对象之间的可空性有不同的要求。通常我们希望保证响应中也会返回某个字段,但我们不想在输入中设置相同的字段。例如,
type Student {
firstName: String!
lastName: String!
}
input StudentInput {
firstName: String
lastName: String
}
最后,在许多模式中,给定实体的对象类型和输入对象类型之间通常不存在一对一的映射。一种常见的模式是针对不同的操作使用单独的输入对象类型来进一步微调架构级输入验证:
input CreateUserInput {
firstName: String!
lastName: String!
email: String!
password: String!
}
input UpdateUserInput {
email: String
password: String
}
所有这些示例都说明了一个重要点 - 虽然输入对象类型有时可能会镜像对象类型,但由于业务需求,您在生产模式中看到这种情况的可能性要小得多。
关于graphql - GraphQL 中的输入类型有何意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41743253/
下列说法正确的是: Javascript == Typescript Typescript != Javascript 对于 Dgraph 的 GraphQL+ 来说也是如此吗? GraphQL ==
我正在尝试通过使用 .graphql 文件并传递变量来对 Karate 进行测试。在我的 graphql 架构中,我试图重用另一个 .graphql 文件中的片段。我尝试按照 https://www.
从他们的文档中,它说: The leaf values of any request and input values to arguments are Scalars (or Enums) and
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 5 年前。 Improve
有没有一种技术可以让我在 GraphQL 中像这样声明 ADT? // TypeScript type SomeAlgebraicDataType = | { state: 'A', subSta
在基于 graphql API 构建新应用程序时,我们遇到了以下问题: 我们有一个带有输入字段的突变,其类型是具有自己验证规则的自定义标量(在这种情况下,输入是格式正确的电子邮件地址)。 在客户端,应
从语法上讲,您可以在模式中定义查询或变更,使其返回类型。 但是,操作定义(即客户端调用的查询或突变)必须有一个 SelectionSet,所以我必须这样做: mutation X { field }
我希望能听到这里专家的一些意见。我目前正在 NextJS 项目上工作,我的 graphql 正在运行在另一个 repo 中设置的模拟数据上。现在后端由其他开发人员构建,正在慢慢从模拟数据转向真实数据。
Graphql 中的架构和文档有什么区别? 架构是这样的: type Query { fo: String } 但文件是这样的: query SomeQuery { foo { ba
type Person { firstName: String!, lastName: String!, age: Int! } 如何查询所有 18 岁以上的人? 最佳答案 这
有没有办法提供 GraphQL Schema 设计的可视化图表(类似于 UML)? 背景: 我已经有了一个架构设计,要转换成 GraphQL API。但是,在开始 GraphQL 开发之前,我想创建我
我想了解 GraphQL 的(Java)实现是否足够智能,如果在其中一个提取器的执行期间抛出异常,可以取消预定的数据提取? 例如,我运行一个查询来检索客户的所有订单。假设客户有 100 个订单。这意味
我是graphql的新手,但是我在努力查询。 我想通过他们的电子邮件地址返回用户 我有一个类型定义的调用V1User,它具有以下字段 ID, 电子邮件, 密码, 角色 要根据电子邮件返回用户,此查询中
我将GraphQL包装器放在现有的REST API上,如Zero to GraphQL in 30 minutes中所述。我有一个产品的API端点,该端点具有一个指向嵌套对象的属性: // API R
在 GraphQL 中,空格似乎很重要,因为它分隔 token : { human(id: "1000") { name height } } 然而,spec says那个空格
我正在尝试使用带有属性的 sequelize 获取数据并将其传递给 graphql。 结果在控制台中很好,但 graphql 查询为属性字段返回 null。 我的解析器 getUnpayedL
有没有办法在 graphql 查询中生成静态值? 例如,假设我有一个 user具有名称和电子邮件字段的对象。出于某种原因,我总是希望用户的状态为“已接受”。我怎样才能写一个查询来完成这个? 我想做的事
我已关注 the documentation about using graphql-tools to mock a GraphQL server ,但是这会引发自定义类型的错误,例如: Expect
我今天在生产中有以下 graphql 模式定义: type BasketPrice { amount: Int! currency: String! } type BasketItem {
像这样的graphql模式: type User { id: ID! location: Location } type Location { id: ID! user: User }
我是一名优秀的程序员,十分优秀!