Resolver 是为 GraphQL 查询生成响应的函数集合。简单来说,解析器充当 GraphQL 查询处理程序。 GraphQL 模式中的每个解析器函数都接受四个位置参数,如下所示 -
fieldName:(root, args, context, info) => { result }
解析器函数的如下所示-
//没有参数和返回字符串的解析器函数 greeting:() => { return "hello from LearnFk !!!" }//没有参数和返回列表的解析器函数 students:() => db.students.list()
//带参数和返回对象的解析器函数 studentById:(root,args,context,info) => { return db.students.get(args.id); }
下面给出了位置参数及其描述-
| Sr.No. | Arguments & Remark |
|---|---|
| 1 |
root 包含从解析器在父字段上返回的输出的对象 。 |
| 2 |
args 具有参数的 对象 传递到查询的字段中。 |
| 3 |
context 这是特定查询中所有解析程序共享的对象 。 |
| 4 |
info 它包含有关查询执行状态的信息,包括字段名称,从根到字段的路径。 |
解析器格式化
GraphQL中的解析器可以返回不同类型的值,如下所示-
| Sr.No | Arguments & Remark |
|---|---|
| 1 |
null or undefined 这表明找不到 对象 |
| 2 |
array 这仅在模式指示字段的输出应为列表时有效 |
| 3 |
promise 解析器通常会执行异步操作,如从数据库或后端API中获取信息 |
| 4 |
scalar 或 Object 解析器还可以返回其他值 |
让无涯教程创建一个简单的应用程序来了解解析器,这将创建用于从服务器通过ID查询学生的模式,学生数据将存储在文件中,将使用名为 notarealdb 的节点模块来伪造数据库并从文件中读取。
以下是创建简单应用程序的分步过程-
步骤1 - 下载并安装依赖项
创建一个名为 resolver-app 的文件夹。从终端将目录更改为 resolver-app 。稍后,请按照"环境设置"一章中的步骤3至5进行操作。
步骤2 - 创建Schema文件
在项目文件夹resolver-app中添加schema.graphql文件,并添加以下代码-
type Query { greeting:String students:[Student] studentById(id:ID!):Student }type Student { id:ID! firstName:String lastName:String password:String collegeId:String }
模式文件显示用户可以查询操作,students和 studentById ,要检索具有特定ID的学生,使用数据类型ID!,它显示了不可为空的唯一标识符字段。 students 字段返回一个学生数组,而 greeting 返回一个简单的字符串值。
步骤3 - 创建解析器
在项目文件夹中创建文件 resolvers.js 并添加以下代码-
const db=require(./db) const Query={ //greeting的解析器功能 greeting:() => { return "hello from LearnFk !!!" },//students返回列表的解析器函数 students:() => db.students.list(),
//studentbyId 的解析器函数 studentById:(root,args,context,info) => { //args 将包含在查询中传递的参数 return db.students.get(args.id); } } module.exports={Query}
在这里, studentById 接受三个参数。如本章所述,可以从args中检索 studentId 。要返回特定的学生,需要在学生集合中调用带有id参数的get方法。
要访问模块外部的解析器函数,必须使用module.exports导出查询对象 。
步骤4 - 运行应用程序
创建一个server.js文件。请参阅环境设置一章中的步骤8。在终端中执行命令npm start。服务器将启动并在9000端口上运行。在这里,使用GraphiQL作为客户端来测试应用程序。
打开浏览器,然后输入URL http://localhost:9000/graphiql 。在编辑器中键入以下查询-
{ studentById(id:"S1001") { id firstName lastName } }
以上查询的输出如下所示-
{ "data": { "studentById": { "id": "S1001", "firstName": "Learnfk", "lastName": "Mohammad" } } }