GraphQL(二)- Schema 和 Resolver

news/2024/7/5 4:06:22

在GraphQL中,Schema和Resolver是两个非常重要的概念,是编写GraphQL Server的2个基本单元
本文介绍GraphQL中的Schema和Resolver。

Schema

Schema定义了GraphQL中基于graph的数据格式
参考: https://graphql.org/learn/schema/

Type语言

GraphQL 服务可以用任何语言编写。由于我们不能依赖特定的编程语言语法(如 JavaScript)来讨论 GraphQL 模式,因此我们将定义自己的简单语言。我们将使用“GraphQL 模式语言”:它类似于查询语言,并允许我们以与语言无关的方式讨论 GraphQL 模式。

如用type定义一个对象:

type Book {
    title: String!
    author: String!
    price: Float
    year: Int
}

类型后加!代表这个属性是对象必不可少(Non-Nullable)的,否则是optional的

在object定义中,Query,Mutation和Subscription是不可用做类名的,而typedef这3者则定义了该schema中的Query,Mutaion和Subscription。

Scalar类型

GraphQL提供了5种基本数据类型,分别为:

  • String UTF‐8 字符序列。
  • Int 有符号的 32 位整数。
  • Float 有符号的双精度浮点值。
  • Boolean true/false
  • ID ID 标量类型表示唯一标识符,通常用于重新获取对象或作为缓存的键。ID 类型的序列化方式与字符串相同,但是,将其定义为ID表示它不是可读的。

Enum

type中枚举类型的定义:

enum Days_of_Week{
   SUNDAY
   MONDAY
   TUESDAY
   WEDNESDAY
   THURSDAY
   FRIDAY
   SATURDAY
}

注意数据传递后,枚举类型的内容会变成与枚举变量名字相同的String而不是Int

Array

Schema支持数组,经过数组可以批量Query数据,resolver也可以处理数组中的数据过滤等操作

type Character {
  name: String!
  appearsIn: [Episode]!
}

下面显示!分别定义在数组和数据类型之后的差别:

myField: [String!]

myField: null // valid
myField: [] // valid
myField: ['a', 'b'] // valid
myField: ['a', null, 'b'] // error`

myField: [String]!

myField: null // error
myField: [] // valid
myField: ['a', 'b'] // valid
myField: ['a', null, 'b'] // valid

Interface

和其它语言的面向对象概念一样,graphql也引入了继承的概念,
Interface作为一种抽象类型存在,想要使用必须由实体的type继承。

interface Character {
  id: ID!
  name: String!
  friends: [Character]
  appearsIn: [Episode]!
}

type Human implements Character {
  id: ID!
  name: String!
  friends: [Character]
  appearsIn: [Episode]!
  starships: [Starship]
  totalCredits: Int
}

type Droid implements Character {
  id: ID!
  name: String!
  friends: [Character]
  appearsIn: [Episode]!
  primaryFunction: String
}

Union

Schema中也支持Union类型作为多种类型的Union使用

union SearchResult = Human | Droid | Starship

Input

到目前为止,我们只讨论了将Scalar(如枚举或字符串)作为参数传递到字段中。但您也可以轻松传递复杂对象。这在突变的情况下特别有价值,因为您可能希望传入要创建的整个对象。在 GraphQL 模式语言中,输入类型看起来与常规对象类型完全相同,但使用关键字input

input ReviewInput {
  stars: Int!
  commentary: String
}
mutation CreateReviewForEpisode($review: ReviewInput!) {
  createReview(review: $review) {
    stars
    commentary
  }
}

Resolver

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

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

Resolver函数的示例如下所示 -

//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);
}

下面给出的是参数及其描述 -

  • root 包含从父字段上的解析程序返回的结果的对象。
  • args 一个对象,其中包含传递到查询中的字段的参数。
  • context 这是特定查询中所有解析程序共享的对象。
  • info 它包含有关查询的执行状态的信息,包括字段名称、从根到字段的路径。

http://lihuaxi.xjx100.cn/news/663706.html

相关文章

2022.12 青少年机器人技术等级考试理论综合试卷(三级)

2022年12月 青少年机器人技术等级考试理论综合试卷(三级) 分数: 100 题数: 30 一、 单选题(共 20 题, 共 80 分) 1.舵机接到 Arduino UNO/Nano 主控板的 2 号引脚, 下列选项中, 实现舵机在 0 度…

mysql快速生成100W条测试数据(8)全球各城市人口及经济增长速度并存入mysql数据库

这是之前的文章里面包含一些以前的一些操作流程可以进行参考学习 更加详细操作步骤在第一篇文章里面 mysql快速生成100W条测试数据(1):游戏人物数据 mysql快速生成100W条测试数据(2)公司员工信息 mysql快速生成100W条测…

实时即未来,大数据项目车联网之Flink Watermark(水位线)【十四】

文章目录 1 Flink Watermark(水位线)1 事件时间(event time)2 Flink Window Assigners(窗口分配器)2.1 Tumbling Windows(翻滚窗口)2.2 Sliding Windows(滑动窗口)2.3 Session Windows(会话窗口)2.4 Global Windows(全局窗口)2.5 窗口函数(Window Function)1 Fli…

【C语言】自定义类型

前言男孩子在外面要保护好自己~一、结构体为什么会有结构体呢&#xff1f;但要描述一个复杂对象时&#xff0c;仅用之前学过的基本数据类型表达不了&#xff08;如&#xff1a;我要描述一个人&#xff0c;仅靠基本数据类型只能说定义他的一种属性<如用 int 定义他的年龄>…

【C++】stack和queue的使用

文章目录Stackstack容器的定义方式:接口函数queuequeue容器的定义方式接口函数栈OJ题目最小栈栈的压入,弹出序列逆波兰表达式求值(后缀表达式)中缀表达式->后缀表达式用两个栈实现队列队列OJ题用队列实现栈使用两个队列实现栈使用一个队列实现栈二叉树的层序遍历I二叉树的层…

juc系列(1)---进程,线程,并行,并发

目录概述进程线程关系并发并行&#xff1a;同步异步&#xff1a;对比概述 进程 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至CPU,数据加载至内 存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载…

机器学习笔记之深度玻尔兹曼机(一)玻尔兹曼机系列整体介绍

机器学习笔记之深度玻尔兹曼机——玻尔兹曼机系列整体介绍引言关于含隐变量模型的对数似然梯度玻尔兹曼机受限玻尔兹曼机深度信念网络深度玻尔兹曼机引言 从本节开始&#xff0c;将介绍玻尔兹曼机系列的最后一个模型——深度玻尔兹曼机(Deep Boltzmann Machine,DBM) 关于含隐…

【数据结构和算法】栈—模拟实现Stack和栈相关算法题

文章目录栈的定义Stack模拟实现相关算法题1.栈的压入弹出序列2.逆波兰表达式(后缀表达式)⭐1.什么是逆波兰表达式?如何转换成逆波兰表达式逆波兰表达式如何计算3.有效的括号总结栈的定义 栈作为一种数据结构&#xff0c;是一种只能在一端进行插入和删除操作的特殊线性表。它按…