合约参考
有效 @tag 位置、名称、合约错误等的参考
此功能仅适用于 GraphOS 企业版计划.
您可以通过注册免费 企业试用版.
规则@tag
和合约
有效的@tag
位置
在第一个联邦和第二个联邦中,您可以应用标签到以下 schema 元素来筛选您的合约架构:
- 对象、接口和联合类型定义
- 对象类型的字段
- 第一个联邦不支持为接口类型字段标签
- 在第一个联邦中,您仍然可以通过给接口定义添加标签或确保实现接口字段的对象字段被删除,使接口字段不可访问。
仅在第二个联邦中,您还可以将这些应用于以下
- 接口类型的字段
- 枚举类型及其值
- 输入类型及其字段
- 自定义标量类型的定义
- 字段的参数,但不能是指令参数
有效的@tag
名称
@tag
名称可以包含字母数字字符(a-z
、A-Z
、0-9
),以及连字符(-
)和正斜杠(/
)。- 每个标签名称不能超过128个字符。
type User {id: ID!name: String! @tag(name: "a/b/c/1-2-3")}
依赖的 @tag
当你对对象或接口类型的定义进行标记时,GraphOS会自动将该标记应用到该类型的所有字段上:
type InternalUser @tag(name: "internal") {id: ID! # Also considered to have @tag(name: "internal")}当对对象、接口或联合类型的定义进行标记时,应始终将相同标记应用到返回该类型的每个字段上:
type BillingAccount @tag(name: "internal") {id: ID!acctNumber: String!}type Query {billingAccounts: [BillingAccount!]! @tag(name: "internal")}⚠️ 注意
如果您不这样做,可能会出现合同排除某个类型,同时包括返回该类型的字段的情况。这将产生无效的合同架构。
如果合同排除了实现接口或作为联合体一部分的对象:
只要至少有一个相关联的对象类型仍然存在,则合同无需排除返回该接口或联合的架构字段:
# Two object types implement this interface.interface Identity {id: ID!name: String!}# If this implementing type is excluded...type InternalUser implements Identity @tag(name: "internal") {id: ID!name: String!}# ...but this implementing type remains...type ExternalUser implements Identity {id: ID!name: String!}type Query {# ...then this field doesn't need to be excluded.currentIdentity: Identity}然而,如果子图通过返回排除类型对象解决其中一个字段,则在路由器中发生运行时错误,并且操作失败。
过滤的特殊情况
如果合同定义了一个包含的
@tags
的列表,任何没有包含标记的对象或接口类型在合同架构中仍然包括,如果至少有一个其字段是包含的:# This type definition is included because one if its fields is included.type User {id: ID! @tag(name: "includeMe")}如果合同排除了对象或接口类型的每个字段,整个类型定义将排除在合同架构之外:
# This object type is excluded because all its fields are excluded.type User {id: ID! @tag(name: "excludeMe")}⚠️ 注意
如果任何返回排除类型的字段被包含,则可能会产生无效的合同架构。
如果合同排除了联合类型中包含的每个对象类型,整个联合类型定义将排除在合同架构之外:
# This union type is excluded because all its possible types are excluded.union Media = Book | Movietype Book @tag(name: "excludeMe") {title: String!}type Movie @tag(name: "excludeMe") {title: String!}⚠️ 注意
如果包含任何返回排除联合类型的字段,则可能会生成一个无效的合同模式。
即使标记了,合同无法排除以下任何内容:
- 内置 标量(
Int
,Float
等。) - 内置 指令(
@skip
,@include
等。) - 应用于 类型系统位置的 自定义指令(查看列表)
- 内置 标量(
合同可以排除用于计算字段的对象字段,而不会导致运行时错误。
错误
GraphOS在创建或更新合同模式时可能会遇到以下错误。错误描述包括创建过程中发生错误的位置:
Error | Description |
---|---|
| 在为指令添加 |
| 在增强指令定义以支持 |
| 在排除对象或接口类型的所有字段后,在排除整个类型时发生错误。 |
| 在排除联合类型所包含的所有类型后,在排除整个联合时发生错误。 |
| 合同尝试包含和排除相同的标签。 |
| 在包含和排除字段后,生成的合同模式解析失败。 |
| GraphOS在尝试从源模式方案中获取所有 |
| 排除接口字段的返回类型时发生错误,并在排除该接口字段时发生错误。 |
| GraphOS在检索源变体的方案时遇到错误。它可能还没有一个有效的组合方案。 |
| GraphOS 在尝试向字段添加父标签时遇到了错误。 |
| GraphOS 遇到错误,无法确定基于标签哪些类型和字段不可访问。 |
| GraphOS 在尝试从合约变体的超图规范生成 API 规范时遇到了错误。 |
| GraphOS 由于未知原因无法生成并返回合约超图规范。 |
| 发生了未知错误。 |
| GraphOS 在尝试在结果合约规范中排除不可达类型时遇到了错误。 |
| 合约不支持使用的 Federation 版本。 |