加入我们,于10月8日至10日在纽约市学习关于 GraphQL 联邦和 API 平台工程的最新技巧、趋势和新闻。加入2024年在纽约市举行的 GraphQL 高峰论坛
文档
免费开始

合约参考

有效 @tag 位置、名称、合约错误等的参考


此功能仅适用于 GraphOS 企业版计划.
您可以通过注册免费 企业试用版.

规则@tag和合约

有效的@tag位置

在第一个联邦和第二个联邦中,您可以应用标签到以下 schema 元素来筛选您的架构:

  • 对象、接口和联合类型定义
  • 的字段
    • 第一个联邦不支持为接口类型字段标签
    • 在第一个联邦中,您仍然可以通过给接口定义添加标签或确保实现接口字段的对象字段被删除,使接口字段不可访问。

仅在第二个联邦中,您还可以将这些应用于以下

  • 接口类型的字段
  • 枚举类型及其值
  • 输入类型及其字段
  • 自定义类型的定义
  • 参数,但不能是参数

有效的@tag名称

  • @tag名称可以包含字母数字字符(a-zA-Z0-9),以及连字符(-)和正斜杠(/)。
  • 每个标签名称不能超过128个字符。
type User {
id: ID!
name: String! @tag(name: "a/b/c/1-2-3")
}

依赖的 @tag

  • 当你对对象或接口类型的定义进行标记时,会自动将该标记应用到该类型的所有字段上:

    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 | Movie
    type Book @tag(name: "excludeMe") {
    title: String!
    }
    type Movie @tag(name: "excludeMe") {
    title: String!
    }

    ⚠️ 注意

    如果包含任何返回排除联合类型的字段,则可能会生成一个无效的合同模式。

  • 即使标记了,合同无法排除以下任何内容:

    • 内置 Int, Float等。)
    • 内置 @skip, @include等。)
    • 应用于 位置的 自定义指令查看列表
  • 合同可以排除用于计算字段的对象字段,而不会导致运行时错误。

错误

GraphOS在创建或更新合同模式时可能会遇到以下错误。错误描述包括创建过程中发生错误的位置:

ErrorDescription
ADD_DIRECTIVE_DEFINITIONS_IF_NOT_PRESENT

在为指令添加@tag, @inaccessible和核心指令使用情况定义无效时发生错误。

DIRECTIVE_DEFINITION_LOCATION_AUGMENTING

在增强指令定义以支持OBJECT, FIELD_DEFINITION, INTERFACE, 和 UNION时发生错误。

EMPTY_OBJECT_AND_INTERFACE_MASKING

在排除对象或接口类型的所有字段后,在排除整个类型时发生错误。

EMPTY_UNION_MASKING

在排除联合类型所包含的所有类型后,在排除整个联合时发生错误。

INPUT_VALIDATION

合同尝试包含和排除相同的标签。

PARSING

在包含和排除字段后,生成的合同模式解析失败。

PARSING_TAG_DIRECTIVES

GraphOS在尝试从源模式方案中获取所有@tag的使用时发生错误。

PARTIAL_INTERFACE_MASKING

排除接口字段的返回类型时发生错误,并在排除该接口字段时发生错误。

SCHEMA_RETRIEVAL

GraphOS在检索源变体的方案时遇到错误。它可能还没有一个有效的组合方案。

TAG_INHERITING

GraphOS 在尝试向字段添加父标签时遇到了错误。

匹配标签

GraphOS 遇到错误,无法确定基于标签哪些类型和字段不可访问。

转换为 API 规范

GraphOS 在尝试从合约变体的超图规范生成 API 规范时遇到了错误。

转换为过滤器规范

GraphOS 由于未知原因无法生成并返回合约超图规范。

未知

发生了未知错误。

不可达类型遮挡

GraphOS 在尝试在结果合约规范中排除不可达类型时遇到了错误。

版本检查

合约不支持使用的 Federation 版本。

上一页
创建和使用合约
评价文章评价在 GitHub 上编辑编辑论坛Discord

©2024阿波罗图灵网络通讯有限公司,简称阿波罗图灵。

隐私政策

公司