组合提示
组合提示参考
当您成功组合 您的 子图 提供的模式到 超级图模式,组合过程可以标记潜在改进或提示。提示是违反GraphOS模式检查器的 组合规则。您可以在检查页面上查看它们,在GraphOS Studio中或通过Rover CLI。
ⓘ 注意
组合 提示仅在GraphOS Studio以及通过rover subgraph check
是用于图的命令。2.4 联邦版本
或更高版本。您可以从图的“设置”页面更新版本。 可在GraphOS Studio中找到。
命令 rover subgraph check
会根据您为graph变体配置的严重级别,输出违规规则。严重级别。命令rover supergraph compose
将输出本地子图模式的违规规则。
下面列出了一系列根据违规类型进行分类的组合规则。每条规则的标题是GraphOS返回的违规代码。有关违规规则的综合列表,请参考规范页面。
不一致的元素
这些规则可以识别字段、类型、参数等不同子图中的不一致性。此类不一致性可能扰乱甚至破坏组合。
兼容性
在某些情况下,不一致规则也指示检查类型之间的兼容性。如果一种类型是非可为空的版本、列表版本、子类型或这些的组合之一,则两种类型是兼容的。
例如,以下示例子图中price
字段不一致且不兼容,因为它们使用了完全不同的类型(Float
与String
):
type Product {id: ID!name: Stringprice: Float}
type Product {id: ID!name: Stringprice: String}
以下示例中的子图中,这些price
域的值不一致,但由于两者都使用Float
类型,因此是兼容的;一个可空,另一个是非空Float
s 列表。
type Product {id: ID!name: Stringprice: Float}
type Product {id: ID!name: Stringprice: [Float]!}
功能
检查参数是否在所有子图中存在。示例
以下示例违反了规则
type Product {id: ID!name: Stringprice(currency: Currency): Float}
type Product {id: ID!name: Stringprice(currency: Currency, taxIncluded: Boolean): Float}
使用以下代替
type Product {id: ID!name: Stringprice(currency: Currency, taxIncluded: Boolean): Float}
type Product {id: ID!name: Stringprice(currency: Currency, taxIncluded: Boolean): Float}
示例
因为子图 A 的price
域期望非空货币
参数类型,而子图 B 允许可空货币
参数类型,以下示例违反了规则:
type Product {id: ID!name: Stringprice(currency: Currency!): Float}enum Currency {USDEURGBPJPYAUDCAD}
type Product {id: ID!name: Stringprice(currency: Currency): Float}enum Currency {USDEURGBPJPYAUDCAD}
使用以下代替
type Product {id: ID!name: Stringprice(currency: Currency!): Float}enum Currency {USDEURGBPJPYAUDCAD}
type Product {id: ID!name: Stringprice(currency: Currency!): Float}enum Currency {USDEURGBPJPYAUDCAD}
理由
不一致的类型可能导致数据检索和处理不一致,从而造成客户端行为意外。示例
以下示例违反了规则
type Product {id: ID!name: Stringprice: Money}type Money {amount: Float!currency: Currency!}enum Currency {USDEURGBPJPYAUDCAD}
type Product {id: ID!name: Stringprice: Money!}type Money {amount: Float!currency: Currency!}enum Currency {USDEURGBPJPYAUDCAD}
使用以下代替
type Product {id: ID!name: Stringprice: Money!}type Money {amount: Float!currency: Currency!}enum Currency {USDEURGBPJPYAUDCAD}
type Product {id: ID!name: Stringprice: Money!}type Money {amount: Float!currency: Currency!}enum Currency {USDEURGBPJPYAUDCAD}
功能
检查参数定义(字段、输入字段或指令定义)是否在所有定义参数的子图中一致地包含——或不包含——默认值。理由
不一致的默认值可能导致数据检索和处理方式不一致,从而引起客户端不可预期的行为。示例
以下示例违反了规则
type Product {id: ID!name: Stringweight(kg: Float = 1.0): Float}
type Product {id: ID!name: Stringweight(kg: Float): Float}
使用以下代替
type Product {id: ID!name: Stringweight(kg: Float = 1.0): Float}
type Product {id: ID!name: Stringweight(kg: Float = 1.0): Float}
功能
检查类型的描述在所有子图中是否一致。理由
不一致的类型描述可能导致对类型值的不一致预期,从而引起客户端不可预期的行为。示例
以下示例违反了规则
"""A type representing a product."""type Product {id: ID!name: String}
"""An object representing a product."""type Product {id: ID!name: String}
使用以下代替
"""A type representing a product."""type Product {id: ID!name: String}
"""A type representing a product."""type Product {id: ID!name: String}
理由
INCONSISTENT_ENUM_VALUE_FOR_INPUT_ENUM示例
以下示例违反了规则
type Product @key(fields: "id") {id: ID!name: String}
type Product {id: ID!stock: Int}
使用以下代替
type Product @key(fields: "id") {id: ID!name: String}
type Product @key(fields: "id") {id: ID!stock: Int}
功能
当仅作为输入类型的枚举值只在声明枚举的某些子图中定义时,不一致的值将不会合并到超图
中。 理由
了解更多。示例
以下示例违反了规则
enum ProductStatus {AVAILABLESOLD_OUTBACK_ORDER}input ProductInput {name: String!status: ProductStatus!}
enum ProductStatus {AVAILABLESOLD_OUT}input ProductInput {name: String!status: ProductStatus!}
使用以下代替
enum ProductStatus {AVAILABLESOLD_OUTBACK_ORDER}input ProductInput {name: String!status: ProductStatus!}
enum ProductStatus {AVAILABLESOLD_OUTBACK_ORDER}input ProductInput {name: String!status: ProductStatus!}
功能
检查输出枚举类型值在所有声明枚举的子图中是否一致定义。理由
当输出或未使用枚举类型定义的值不一致时,所有值将合并到超图
中。不过,最好在所有定义枚举的子图中包含所有可能值,以设置期望。 示例
以下示例违反了规则
enum OrderStatus {CREATEDPROCESSINGCOMPLETED}type Order {name: String!status: OrderStatus!}
enum OrderStatus {CREATEDCOMPLETED}type Order {name: String!status: OrderStatus!}
使用以下代替
enum OrderStatus {CREATEDPROCESSINGCOMPLETED}type Order {name: String!status: OrderStatus!}
enum OrderStatus {CREATEDPROCESSINGCOMPLETED}type Order {name: String!status: OrderStatus!}
功能
检查可执行指令定义在整个子图中声明的一致位置。示例
以下示例违反了规则
directive @log(message: String!) on QUERY
directive @log(message: String!) on FIELD
使用以下代替
directive @log(message: String!) on QUERY | FIELD
directive @log(message: String!) on QUERY | FIELD
功能
检查可执行指令定义是否在所有子图中声明。示例
以下示例违反了规则
directive @modify(field: String!) on FIELD
# 🦗🦗🦗
使用以下代替
directive @modify(field: String!) on FIELD
directive @modify(field: String!) on FIELD
功能
检查可执行指令定义是否在声明它的所有子图中标记为可重复的repeatable
。理由
除非可执行指令在所有子图中都定义为repeatable
,否则在超图中将不可重复。示例
以下示例违反了规则
directive @validateLength(max: Int!) repeatable on FIELD
directive @validateLength(max: Int!) on FIELD
使用以下代替
directive @validateLength(max: Int!) repeatable on FIELD
directive @validateLength(max: Int!) repeatable on FIELD
功能
检查输入对象定义中的一个字段是否在声明该输入对象的所有子图中定义。示例
以下示例违反了规则
input ProductInput {name: Stringprice: Float}input OrderInput {product: ProductInput}
input ProductInput {name: String}input OrderInput {product: ProductInput}
使用以下代替
input ProductInput {name: Stringprice: Float}input OrderInput {product: ProductInput}
input ProductInput {name: Stringprice: Float}input OrderInput {product: ProductInput}
功能
检查界面值类型字段(任何子图中没有@key
)是否在声明该类型的所有子图中定义。示例
以下示例违反了规则
interface Product {id: ID!name: Stringcost: Float}type DigitalProduct implements Product {id: ID!name: Stringcost: Floatsize: Int}
interface Product {id: ID!name: String# cost is not defined in the interface}type PhysicalProduct implements Product {id: ID!name: Stringcost: Floatweight: Float}
使用以下代替
interface Product {id: ID!name: Stringcost: Float}type DigitalProduct implements Product {id: ID!name: Stringcost: Floatsize: Int}
interface Product {id: ID!name: Stringcost: Float}type PhysicalProduct implements Product {id: ID!name: Stringcost: Floatweight: Float}
功能
检查是否有一个不可重复的指令被应用于具有不同参数的不同子图中的模式元素。repeatable
指令。理由
不一致的指令参数使用可能导致客户端应用程序中的误解和潜在问题。示例
以下示例违反了规则
type Product {id: ID!name: String}type Query {allProducts: [Product] @customDirective(orderBy: "name")}
type Product {id: ID!name: String}type Query {allProducts: [Product] @customDirective(orderBy: "price")}
使用以下代替
type Product {id: ID!name: String}type Query {allProducts: [Product] @customDirective(orderBy: "name")}
type Product {id: ID!name: String}type Query {allProducts: [Product] @customDirective(orderBy: "name")}
示例
以下示例违反了规则
type Product {id: ID! @shareablename: String @shareableprice: Float}
type Product {id: ID! @shareablename: String @shareable}
使用以下代替
type Product @shareable {id: ID!name: Stringprice: Float}
type Product @shareable {id: ID!name: Stringprice: Float}
功能
检查一个@shareable
字段在整个定义了该字段的子图中返回一致的运行时类型集合。示例
以下示例违反了规则
type Product {id: ID!name: Stringdetails: Details @shareable}type Details {size: String}
type Product {id: ID!name: Stringdetails: Details @shareable}type Details {weight: Float}
使用以下代替
type Product {id: ID!name: Stringdetails: Details @shareable}type Details {size: String}
type Product {id: ID!name: Stringdetails: Details @shareable}type Details {size: String}
功能
检查一个类型系统指令的定义在所有子图中声明了一致的位置。示例
以下示例违反了规则
directive @customDirective(message: String!) on OBJECT | FIELD_DEFINITION
directive @customDirective(message: String!) on FIELD_DEFINITION
使用以下代替
directive @customDirective(message: String!) on OBJECT | FIELD_DEFINITION
directive @customDirective(message: String!) on OBJECT | FIELD_DEFINITION
示例
以下示例违反了规则
directive @customDirective on OBJECT
directive @customDirective repeatable on OBJECT
使用以下代替
directive @customDirective repeatable on OBJECT
directive @customDirective repeatable on OBJECT
功能
检查联合定义中的成员是否在声明该联合的 所有子图 中都得到定义。示例
以下示例违反了规则
type Product {id: ID!name: String}type Service {id: ID!description: String}union SearchResult = Product | Service
type Product {id: ID!name: String}union SearchResult = Product
使用以下代替
type Product {id: ID!name: String}type Service {id: ID!description: String}union SearchResult = Product | Service
type Product {id: ID!name: String}type Service {id: ID!description: String}union SearchResult = Product | Service
已覆盖和未使用的元素
示例
以下示例违反了规则
type Product @key(fields: "id") {id: ID!inStock: Boolean! @override(from: "Subgraph B")}
type Product @key(fields: "id") {id: ID!name: String!}
使用以下代替
type Product @key(fields: "id") {id: ID!inStock: Boolean!}
type Product @key(fields: "id") {id: ID!name: String!}
功能
检查字段是否被另一个子图覆盖。理由
应考虑删除覆盖字段以避免混淆。示例
以下示例违反了规则
type Product @key(fields: "id") {id: ID!inStock: Boolean! @override(from: "Subgraph B")}
type Product @key(fields: "id") {id: ID!name: String!inStock: Boolean!}
使用以下代替
type Product @key(fields: "id") {id: ID!name: String!inStock: Boolean!}
type Product @key(fields: "id") {id: ID!name: String!}
功能
检查字段迁移是否正在进行。理由
应完成字段迁移。示例
以下示例违反了规则
type Product @key(fields: "id") {id: ID!inStock: Boolean! @override(from: "Subgraph B", label: "percent(50)")}
type Product @key(fields: "id") {id: ID!name: String!inStock: Boolean!}
迁移完成后,使用以下方法替代
type Product @key(fields: "id") {id: ID!name: String!inStock: Boolean!}
type Product @key(fields: "id") {id: ID!name: String!}
功能
检查枚举类型是否已定义,但其在任何子图引用中没有字段或参数。理由
如果枚举已定义,则应使用或删除它。示例
以下示例违反了规则
enum ProductStatus {AVAILABLESOLD_OUT}type Product {id: ID!name: String}
type Order {id: ID!product: Productstatus: String}
使用以下代替
enum ProductStatus {AVAILABLESOLD_OUT}type Product {id: ID!name: Stringstatus: ProductStatus}
type Order {id: ID!product: Productstatus: ProductStatus}
指令
功能
检查自定义指令组合时的问题。示例
以下示例违反了规则
type Product {id: ID!name: String}type Query {products: [Product] @customDirective(orderBy: ["name"])}
type Product {id: ID!name: String}type Query {products: [Product] @customDirective(orderBy: ["price"])}
使用以下代替
type Product {id: ID!name: String}type Query {products: [Product] @customDirective(orderBy: ["name", "price"])}
type Product {id: ID!name: String}type Query {products: [Product] @customDirective(orderBy: ["name", "price"])}
理由
指令必须在它们声明的属于的位置中使用。如果不同的子图中对同一可执行指令有不同的位置定义,这可能是子图所有者需要就指令使用进行沟通的迹象。示例
以下示例违反了规则
directive @log(message: String!) on QUERY
directive @log(message: String!) on FIELD
使用以下代替
directive @log(message: String!) on QUERY | FIELD
directive @log(message: String!) on QUERY | FIELD
示例
以下示例违反了规则
type Product @key(fields: "id") {id: ID!inStock: Boolean! @override(from: "Subgraph B")}
# Subgraph B doesn't exist
使用以下代替
type Product @key(fields: "id") {id: ID!inStock: Boolean! @override(from: "Subgraph B")}
type Product @key(fields: "id") {id: ID!inStock: Boolean!}