📜  GraphQL-解析器

📅  最后修改于: 2020-10-25 05:08:54             🧑  作者: Mango


解析器是为GraphQL查询生成响应的函数的集合。简单来说,解析器充当GraphQL查询处理程序。 GraphQL模式中的每个解析器函数接受四个位置参数,如下所示:

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

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

//resolver function  with no parameters and returning string
greeting:() => {
   return "hello from  TutorialsPoint !!!"
}

//resolver function with no parameters and returning list
students:() => db.students.list()

//resolver function with arguments and returning object
studentById:(root,args,context,info) => {
   return db.students.get(args.id);
}

下面给出了位置参数及其描述-

Sr.No. Arguments & Description
1

root

The object that contains the result returned from the resolver on the parent field.

2

args

An object with the arguments passed into the field in the query.

3

context

This is an object shared by all resolvers in a particular query.

4

info

It contains information about the execution state of the query, including the field name, path to the field from the root.

解析器结果格式

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

Sr.No. Arguments and Description
1

null or undefined

this indicates the object could not be found

2

array

this is only valid if the schema indicates that the result of a field should be a list

3

promise

resolvers often do asynchronous actions like fetching from a database or backend API, so they can return promises

4

scalar or object

a resolver can also return other values

插图

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

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

步骤1-下载并安装项目的必需依赖项

创建一个名为resolver-app的文件夹。从终端将目录更改为resolver-app 。稍后,请按照“环境设置”一章中的步骤3到5进行操作。

第2步-创建架构

在项目文件夹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
}

模式文件显示用户可以查询问候语,studentsstudentById 。要检索具有特定ID的学生,我们使用数据类型ID!其中显示了不可为空的唯一标识符字段。 students域返回一个学生数组, greeting返回一个简单的字符串值。

第3步-创建解析器

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

const db = require('./db')
const Query = {
   //resolver function for greeting
   greeting:() => {
      return "hello from  TutorialsPoint !!!"
   },
   
   //resolver function for students returns list
   students:() => db.students.list(),

   //resolver function for studentbyId
   studentById:(root,args,context,info) => {
      //args will contain parameter passed in query
      return db.students.get(args.id);
   }
}
module.exports = {Query}

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

在这里,问候语,students,studentById是处理查询的解析器。学生解析器函数从数据访问层返回学生列表。要访问模块外部的解析器功能,必须使用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": "Mohtashim",
         "lastName": "Mohammad"
      }
   }
}