Logo
Section 1 / 3

根字段与解析器

了解 GraphQL 中根字段和解析器的工作原理。

导入

根字段与解析器

了解 GraphQL 中根字段和解析器的工作原理。

在本节课中,我们将学习 GraphQL 服务器如何执行一个 GraphQL 查询,并返回与所调用的查询结构相对应的响应。

下面的示例查询使用了本节课中一直使用的类型系统:

1 type Pizza { 2 id: Int! 3 pizza: String! 4 stock: Int! 5 toppings: [Topping!]! 6 } 7 8 type Topping { 9 id: Int! 10 topping: String! 11 } 12 13 type Query { 14 pizzas: [Pizza] 15 }

我们以之前的一个查询为例:

1query{ 2 pizzas { 3 __typename 4 ... on Pizza { 5 id 6 toppings { 7 id 8 topping 9 } 10 pizza 11 } 12 } 13}

我们可以将 GraphQL 查询中的每个字段视为一个函数。每个字段都对应一个由 GraphQL 服务器开发者提供的解析器函数(resolver function)。当某个字段被调用时,相应的解析器就会被触发,用于生成该字段的值。

如果某个字段生成的是标量值(如数字或字符串),那么该请求就此完成。但如果字段生成的是对象值,则查询中通常还会包含对该对象的进一步字段选择。GraphQL 解析器会持续执行,直到所有字段都被解析为标量值为止。GraphQL 查询最终总是以标量值作为结果结束。

1 Query: { 2 pizza: (parent, args, context) => { 3 const { id } = args; 4 if(id){ 5 // 这是一个简单的 ID 匹配的模拟实现 6 // 在生产环境中,你应该从真实的数据库中查询数据! 7 return pizzas.find(({id: pizzaId})=> pizzaId === id); 8 } 9 return undefined 10 }, 11 },

根字段与解析器

GraphQL 服务器始终从 Root 或 Query 类型开始执行。

在本示例中,我们的 Query 类型提供了一个名为 pizza 的字段,该字段接受 id 作为参数。该字段的解析器方法通常会访问数据库,然后构造并返回一个 Pizza 对象。

上述示例是用 JavaScript 实现的,但在其他编程语言中原理相同。任何解析器函数都会接收四个参数:

  • obj:表示上一层的父对象,在根 Query 类型的字段中通常不使用。
  • args:表示在 GraphQL 查询中传递给当前字段的参数。
  • context:每个解析器都会接收到的上下文对象,其中包含重要的全局信息,例如当前用户的身份认证信息或数据库连接。
  • info:包含当前查询中与字段相关的具体信息以及模式(schema)的细节。

测试 GraphQL 解析器

请在 GraphQL Playground 中测试这些 GraphQL 解析器。

模式验证

标量强制类型转换