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"
}
}
}