GraphQL 中的 `schema` typedef 有啥用?

Posted

技术标签:

【中文标题】GraphQL 中的 `schema` typedef 有啥用?【英文标题】:What is the use of `schema` typedef in GraphQL?GraphQL 中的 `schema` typedef 有什么用? 【发布时间】:2018-06-06 22:03:27 【问题描述】:

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

let typeDefs = [`
type Query 
  hello: String


schema 
  query: Query
`];

在定义解析器后,它会生成带有makeExecutableSchema 的架构:

let schema = makeExecutableSchema(typeDefs, resolvers);

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

http://localhost:3000/graphql/?query=hello

返回:

"data":"hello":"world"

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

let typeDefs = [`
type Query 
  hello: String


schema 
  testquery: Query
`];

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

我已通读Apollo's tutorial pages 和How To GraphQL tutorial for Node.js + GraphQL,但找不到对schema 部分的引用。

它是做什么用的?

【问题讨论】:

apollographql.com/blog/… 【参考方案1】:

关于架构

一个模式最多可以有三种根操作类型,但它只需要一种。查询类型必须存在于每个模式中,并且必须是对象类型 (Spec)。此类型是对 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

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

【讨论】:

以上是关于GraphQL 中的 `schema` typedef 有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL 中的 `schema` typedef 有啥用?

将内容类型导入 Meteor 中的 schema.graphql

GraphQL 选择集解析

了解 GraphQL 联合类型

Graphql 查询数组

接口扩展了 GraphQL Schema 中的多个接口