GraphQL 解析器

17 Mar 2025 | 4 分钟阅读

GraphQL 解析器是一系列函数,用于填充架构中单个字段的数据。解析器指定 Apollo Server 处理 GraphQL 操作的方式。当我们使用 Apollo Server 进行通信时,它需要知道如何填充架构中每个字段的数据,因为它必须响应对该特定数据的请求。在这里,我们使用解析器来实现这种通信。

简单地说,我们可以说解析器用于处理 GraphQL 查询。如果用户没有为特定字段定义解析器,Apollo Server 会自动定义一个默认解析器。

每个解析器函数在 GraphQL 架构中接受以下四个位置参数

语法

我们可以用不同的方式指定解析器函数

例如

参数解释

  • root/parent: 用于指定包含父字段解析器返回结果的对象。当 rootValue 函数传递给 Apollo Server 的构造函数时,将返回此值。
  • args: 用于指定包含传递到查询中字段的所有 GraphQL 参数的对象。例如:如果您执行查询 { user(id: "3") },则表明传递给 user 解析器的 args 对象是 { "id": "3" }。
  • context: 用于指定特定查询中所有解析器共享的对象。它用于共享身份验证信息、数据加载器实例以及其他任何可以轻松跨解析器跟踪的信息。
  • info: 用于包含有关操作执行状态或查询执行状态的所有信息,包括字段名称、从根到该字段的路径等等。info 的核心字段可以在 GraphQL.js 源代码中找到。这些字段可以通过其他模块扩展其他功能,例如 apollo-cache-control。

GraphQL 解析器结果格式/返回值

GraphQL 返回值或结果格式由 Apollo Server 根据其类型进行不同处理

  • 标量/对象: 根据解析器的定义方式,解析器可以返回单个值或对象。您可以通过 root 参数将此结果或返回值传递给任何嵌套的解析器。
  • 数组: 仅当您的架构显示解析器的关联字段包含列表时,它才返回数组。之后,Apollo Server 对数组的每个项目执行嵌套解析器。
  • null / undefined: null 或 undefined 字段指定找不到该字段的值。在这种情况下,如果您的架构显示解析器的字段是可为空的,则操作结果在该字段的位置具有空值。如果它显示解析器的字段不可为空,则 Apollo Server 将该字段的父级设置为 null。此过程会连续重复解析器链,直到它获得一个可为空的字段。这表明响应永远不会包含不可为空字段的空值。
  • Promise: GraphQL 解析器可以返回 Promise。解析器执行异步操作,例如从数据库或后端 API 获取数据。因此,从数据库加载是一个异步操作,它返回一个 Promise。

示例

让我们创建一个简单的例子,看看解析器是如何工作的。在此示例中,我们将创建一个架构来从服务器按 id 查询员工的详细信息。员工数据将存储在一个平面文件中,我们将使用一个名为 notarealdb 的 node 模块从该平面文件中读取数据

按照前面页面(例如 GraphQL 第一个示例或 GraphQL 架构文件)中定义的先前步骤,即下载并安装项目所需的依赖项,然后按照前面定义的创建架构。

创建解析器

在主项目文件夹中创建一个文件 resolvers.js,并在其中使用以下代码

运行服务器

现在,像在前面的页面中所做的那样运行服务器,打开浏览器并输入 url,https://:4000/graphiql。

在编辑器中使用以下查询

输出

{
  "data": {
    "hello": "Welcome to JavaTpoint...."
    "employeeById": [    
   {
      "id": "E1001",
      "firstName":"Ajeet",
      "lastName":"Kumar",
      }
   }
}