GraphQL中的`schema` typedef有什么用途?

4
我正在使用Apollo + Express开始学习GraphQL,我发现这个例子在typedefs底部添加了一个schema名称。
let typeDefs = [`
type Query {
  hello: String
}

schema {
  query: Query
}`];

在定义解析器后,使用makeExecutableSchema生成模式:

let schema = makeExecutableSchema({typeDefs, resolvers});

然而,如果我从typedefs中删除schema部分,我仍然可以正常使用我的端点,例如:
http://localhost:3000/graphql/?query={hello}

返回:

{"data":{"hello":"world"}}

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

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

schema {
  testquery: Query
}`];

GraphQLError: 语法错误: 意外名称 "testquery"

我已经阅读过Apollo的教程页面以及 How To GraphQL教程(适用于Node.js+GraphQL),但找不到有关schema部分的参考文献。

它是用来做什么的?


https://www.apollographql.com/blog/three-ways-to-represent-your-graphql-schema-a41f4175100d/ - zloctb
1个回答

7

关于模式

一个模式可以有最多三种根操作类型但只需要一个。查询类型必须存在于每个模式中,且必须是对象类型 (规范)。当在GraphQL中进行查询时,这种类型是根类型。此外还有一个用于执行变更操作的变更根类型。最近新增了订阅类型。

关于根类型

根类型是简单的对象类型。它们可以有字段和这些字段是参数。默认情况下,查询类型称为查询(Query),变更类型称为变更(Mutation),订阅根类型称为订阅(Subscription)。如果按照这些标准名称,可以省略模式(schema)规范。

# Doesn't need further specification, Query is the default name
type Query {
  # ...
}

但是你可以随意命名这些类型。要定义哪个对象类型是进入图形的根类型,您必须使用模式定义。

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

schema {
  # Needs to be defined in the schema declaration
  query: MyQuery
}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接