GraphQL Resolver 解析器

GraphQL Resolver (以下称为 解析器)是一组为 GraphQL 查询生成响应的函数。简单来说,解析器充当 GraphQL 查询处理程序。GraphQL schema 中的每个解析器函数都有四个参数,如下所示

fieldName:(root, args, context, info) => { result }

解析器功能的示例如下所示

// 没有参数的解析器函数,并且返回一个字符串
greeting:() => {
   return "hello from  Jiyik !!!"
}

// 没有参数的解析器函数,并且返回一个列表
students:() => db.students.list()

// 带有参数的解析器函数,并且返回一个对象
studentById:(root,args,context,info) => {
   return db.students.get(args.id);
}

下面给出了参数及其描述

序号 参数 描述
1 root 包含从父字段上的解析器返回的结果的对象。
2 args 带有传递到查询字段中的参数的对象。
3 context 这是特定查询中所有解析器共享的对象。
4 info 它包含有关查询执行状态的信息,包括字段名称、从根到字段的路径。

解析器返回结果格式

GraphQL 中的解析器可以返回不同类型的值,如下所示

序号 类型 描述
1 null 或者 undefined 这表示找不到对象
2 array 仅当 schema 指示字段的结果应为列表时才有效
3 promise 解析器通常会执行异步操作,例如从数据库或后端 API 中获取数据,因此它们可以返回 promise
4 scalar or object 解析器还可以返回其他值

让我们创建一个简单的应用程序来理解 Resolver。这将创建用于从服务器通过 id 查询学生的 schema。学生数据将存储在一个平面文件中,我们将使用一个名为notarealdb的节点模块来伪造一个数据库并从平面文件中读取。

以下是创建简单应用程序的过程

一、下载并安装项目所需的依赖项

创建一个名为 app 的文件夹。从终端将目录更改为app。稍后,按照GraphQL 开发环境的搭建一章中的步骤 3 到 5完成下载和安装过程。

二、创建Schema

在项目文件夹app 中添加 schema.graphql 文件并添加以下代码

schema.graphql

type Query { 
   greeting:String
   students:[Student]
   studentById(id:ID!):Student 
}

type Student {
   id:ID!
   firstName:String
   lastName:String
   password:String
   collegeId:String
}

schema 文件显示用户可以查询 greeting、students和studentById。要检索具有特定 ID 的学生,我们使用数据类型 ID! 它是一个不可为空的唯一标识符字段。students 字段返回一个列表,并且 greeting 返回一个简单的字符串值。

三、创建解析器

在项目文件夹中创建一个文件resolvers.js并添加以下代码

resolvers.js

const db = require('./db')
const Query = {
   greeting:() => {
      return "hello from  Jiyik !!!"
   },
   
   students:() => db.students.list(),

   studentById:(root,args,context,info) => {
      return db.students.get(args.id);
   }
}
module.exports = {Query}

在这里,studentById 接受三个参数。正如本章所讨论的,可以从 args 中检索studentId;root 将包含 Query 对象本身。要返回特定的学生,我们需要在 students 集合中调用带有 id 参数的 get 方法。

在这里,greeting、students、studentById是处理查询的解析器。students 解析器函数从数据访问层返回学生列表。要访问模块外的解析器函数,必须使用 module.exports 导出 Query 对象。

四、 运行应用程序

创建一个 server.js 文件。请参阅GraphQL 开发环境的搭建章节中的步骤 8。在终端中执行命令 npm start。服务器将在 9000 端口上启动并运行。在这里,我们使用 GraphiQL 作为客户端来测试应用程序。

在编辑器中输入以下查询

{  
   studentById(id:"S1001") {
      id
      firstName
      lastName
   }
}

上述查询的输出如下所示

{
  "data": {
    "studentById": {
      "id": "S1001",
      "firstName": "feng",
      "lastName": "qianlang"
    }
  }
}

graphql resolver运行结果

查看笔记

扫码一下
查看教程更方便