GraphQL 中`schema` typedef 有什么用?

ari*_*nmz 4 node.js apollo graphql

我正在使用 Apollo + Express 开始使用 GraphQL,我看到该示例schema在 typedef 的底部添加了一个名称:

let typeDefs = [`
type Query {
  hello: String
}

schema {
  query: Query
}`];
Run Code Online (Sandbox Code Playgroud)

在定义解析器后,它会使用以下内容生成架构makeExecutableSchema

let schema = makeExecutableSchema({typeDefs, resolvers});
Run Code Online (Sandbox Code Playgroud)

但是,如果我删除schematypedefs的一部分,我仍然可以正常使用我的端点,例如:

http://localhost:3000/graphql/?query={hello}
Run Code Online (Sandbox Code Playgroud)

返回:

{"data":{"hello":"world"}}
Run Code Online (Sandbox Code Playgroud)

但是,如果我更改其他内容的查询部分,服务器将失败:

let typeDefs = [`
type Query {
  hello: String
}

schema {
  testquery: Query
}`];
Run Code Online (Sandbox Code Playgroud)

GraphQLError:语法错误:意外的名称“testquery”

我已经阅读了Apollo 的教程页面以及Node.js + GraphQLHow To GraphQL 教程,但找不到该schema部分的参考。

它是干什么用的?

Her*_*rku 5

关于架构

一个模式最多可以有三种根操作类型,但它只需要一种。查询类型必须存在于每个模式中,并且必须是对象类型 ( Spec )。此类型是对 GraphQL 进行查询时的根类型。此外,在进行突变时使用了一种突变根类型。最新添加的是订阅类型。

关于根类型

根类型是简单的对象类型。它们可以有字段,这些字段是参数。默认情况下,调用查询类型,调用Query变异类型,调用Mutation订阅根类型Subscription。如果您遵循这些标准名称,schema则可以省略规范。

# Doesn't need further specification, Query is the default name
type Query {
  # ...
}
Run Code Online (Sandbox Code Playgroud)

您仍然可以随意命名这些类型。要定义哪个对象类型是根类型以输入图形,您必须使用架构定义。

# Non standard query type name
type MyQuery {
  # ...
}

schema {
  # Needs to be defined in the schema declaration
  query: MyQuery
}
Run Code Online (Sandbox Code Playgroud)

对于变异和订阅类型也可以做同样的事情。