对不同GraphQL指令的解释

对不同GraphQL指令的解释,graphql,Graphql,我想知道这些不同的GraphQL指令。我试图在网上找到这些指令,但没有得到解释。请解释这些不同类型的指令 enum __DirectiveLocation { QUERY, MUTATION, SUBSCRIPTION, FIELD, FRAGMENT_DEFINITION, FRAGMENT_SPREAD, INLINE_FRAGMENT, SCHEMA, SCALAR, OBJECT, FIELD_DEF

我想知道这些不同的GraphQL指令。我试图在网上找到这些指令,但没有得到解释。请解释这些不同类型的指令

enum __DirectiveLocation {
    QUERY,
    MUTATION,
    SUBSCRIPTION,
    FIELD,
    FRAGMENT_DEFINITION,
    FRAGMENT_SPREAD,
    INLINE_FRAGMENT,
    SCHEMA,
    SCALAR,
    OBJECT,
    FIELD_DEFINITION,
    ARGUMENT_DEFINITION,
    INTERFACE,
    UNION,
    ENUM,
    ENUM_VALUE,
    INPUT_OBJECT,
    INPUT_FIELD_DEFINITION
}

GraphQL指令可以在任何GraphQL中使用——它既包括操作(如查询和变异),也包括用于定义特定模式的类型定义。指令必须指定一个或多个。这些地点分为两组

ExecutableDirectiveLocation
用于可执行文档(即包含可执行操作的文档)。这包括:

QUERY
MUTATION
SUBSCRIPTION
FIELD
FRAGMENT_DEFINITION
FRAGMENT_SPREAD
INLINE_FRAGMENT
SCHEMA
SCALAR
OBJECT
FIELD_DEFINITION
ARGUMENT_DEFINITION
INTERFACE
UNION
ENUM
ENUM_VALUE
INPUT_OBJECT
INPUT_FIELD_DEFINITION
类型系统定义(即用于创建架构的类型定义)中的位置称为
TypeSystemDirectiveLocation
,包括:

QUERY
MUTATION
SUBSCRIPTION
FIELD
FRAGMENT_DEFINITION
FRAGMENT_SPREAD
INLINE_FRAGMENT
SCHEMA
SCALAR
OBJECT
FIELD_DEFINITION
ARGUMENT_DEFINITION
INTERFACE
UNION
ENUM
ENUM_VALUE
INPUT_OBJECT
INPUT_FIELD_DEFINITION
GraphQL文档可以表示为由AST节点组成的抽象语法树(AST)对象。上面的每个位置都与同名的匹配

调用使用一个或多个TypeSystemDirectiveLocation的指令。类似的库允许我们为模式指令定义逻辑,这些指令可用于转换该指令所附加的模式元素。例如,使用Apollo Server,我们扩展了
SchemaDirectiveVisitor
类,该类对每个可能的位置都有一个属性——在生成模式时调用该方法以确定如何更改模式中的目标元素

使用ExecutableDirectiveLocations的指令称为客户端指令。尽管这些是规范的一部分,但只有两个标准的客户端指令存在--
@skip
@include
。可以定义其他自定义客户端指令,但目前还没有在服务器上实现它们的好方法(至少在Node.js生态系统中没有)

以下是每个指令位置的用法示例:

schema @SCHEMA {
  query: Query
}

scalar DateTime @SCALAR

type SomeType @OBJECT {
  someField(someArg: Int! @ARGUMENT_DEFINITION): String @FIELD_DEFINITION 
}

interface SomeInterface @INTERFACE {
  someField: String
}

union SomeUnion @UNION = SomeType | SomeOtherType

enum SomeEnum @ENUM {
  someEnumValue @ENUM_VALUE
}

input SomeInputType @INPUT_OBJECT {
  someInputField: String @INPUT_FIELD_DEFINITION 
}
对于可执行文件:

query MyQuery @QUERY {
  someField @FIELD
  someOtherField {
    ...MyFragment @FRAGMENT_SPREAD
    ... on SomeType @INLINE_FRAGMENT {
      aDifferentField
    }
  }
}

fragment MyFragment @FRAGMENT_DEFINITION {
  yetAnotherField
}

mutation MyMutation @MUTATION {
  doSomething
}

subscription MySubscription @SUBSCRIPTION {
  somethingHappened
}