
Graphcool框架简介
Graphcool是用于生产就绪的无服务器GraphQL后端开发和发布的框架。 它于2017年10月成为开源 。Graphcool包括GraphQL数据库映射,实时订阅和灵活的权限系统。
GraphQL和Graphcool背景
Graphcool基于GraphQL,因此让我们对其进行一些讨论。
GraphQL是一种查询语言规范,由Facebook在2015年发布。 GraphQL提供了比REST更灵活的后端通信可能性。 借助REST,您可以获得许多使用资源的端点,但是GraphQL具有单个端点,而您的需求在查询本身中进行了描述。
GraphQL的名称表明它以图形形式表示数据。 (实际上,GraphQL的名称中包含了GraphQL的主要思想是以图形形式表示数据)。这是一个Facebook示例。 假设您要检索一条包含所有注释及其作者信息的消息。
- 使用REST API,您需要发送多个查询以获取消息,其注释和作者的数据。
- 使用GraphQL API,您可以通过单个后端回复来检索此数据,因为您可以确定返回查询所需要的数据。
在此处了解有关GraphQL的更多信息。

为了使客户理解他或她可以从GraphQL后端查询哪些数据,使用在GraphQL架构定义语言上编写的方案。 该方案是一个数据模型,它描述了应用程序中的数据类型及其关系。 GraphQL模式定义是表示GraphQL方案的最短方法。
语法由官方的GraphQL规范定义。 方案定义有时称为IDL(接口定义语言)或SDL(架构定义语言)。 用于博客中的GraphQL方案可以用这种方式表示。
GraphQL只是一个规范,因此要使用它,您需要为规范实现提供服务。 您可以创建自己的服务,也可以使用Graphcool之类的GraphQL后端即服务(BaaS)。
Graphcool负责保存数据,并为您的应用程序提供GraphQL端点。 您所需要做的就是确定Graphcool方案,它将自动生成用于数据查询和编辑的功能。
如果您的应用程序需要实时更新,则可以使用GraphQL订阅。 Graphcool还为业务逻辑提供数据存储,第三方身份验证集成和服务器功能,因此它是针对应用程序的真正多功能解决方案。
Graphcool的用法
有两种基于Graphcool的开发方法:本地和基于云。
Graphcool Cloud已上线两年了,为项目启动提供了多种可能性。
- 共享群集使用即付即用模型,并可以根据您的要求自动扩展。
- 私有集群类似于共享集群,但是基于您自己的基础架构和AWS账户。
借助Graphcool Framework,可以在个人计算机上启动Graphcool。 结果,加快了开发过程,包括自主开发和CI管道集成。 今天,我们将介绍本地发展。
Graphcool API
Graphcool为您的数据模型提供自动生成的CRUD API。 它还提供了使用GraphQL订阅的实时API和用于文件管理的专用API。 Graphcool的主要优势是根据您为服务选择的数据模型自动生成CRUD API。
该API提供了用于过滤,排序和分页的功能。
每个Graphcool服务都提供基于GraphQL订阅的实时API,它允许及时响应系统事件。 请记住,默认情况下,每个Graphcool服务都提供两个不同的API接口:
- 简单API负责直观的CRUD操作和数据建模。
- 中继API符合中继方案的要求。
这两个API都指向同一个数据库!
Graphcool查询结构

这就是查询所有相同类型的条目及其响应的样子。 该查询由查询名称(在本例中为全部)和要检索的字段列表组成。 响应以对象数组的形式返回,其键为查询中指定的字段。

这样,您可以通过节点ID获得特定条目。 指定模型类型,所需的节点ID放在方括号中,并列出字段。 响应将包含必需类型的对象。
您还可以通过唯一字段获得某个节点。 代替节点的ID,我们通过唯一字段进行搜索。
这些是数据组织的参数:
- 字段排序。 orderBy:<字段> _ASC / <字段> _DESC。 指定字段和排序顺序。
- 提起过滤。
- 分页。
这些参数可以组合。
目前,这些参数的使用存在一些限制:
- 无法通过多个字段或相关字段来请求响应。
- 返回数据对象的最大数量为1000。
Graphcool过滤
过滤值得特别注意。 Graphcool可以按所需节点本身以及相关节点过滤数据。 逻辑运算符AND / OR拓宽了过滤的可能性。 Graphcool可以在/ lt / lte / gt / gte / contains /开头/结尾与运算符及其否定符中使用。
对于每种字段类型,都有某些过滤器,并且文本类型示例可让您查看其中的大多数。 当然有局限性。 数组和JSON过滤尚未实现。

创建,更新和删除节点
为特定类型创建的每个新节点都被分配一个新ID。 必须指定所有没有默认值的必填字段,其他字段是可选参数。 查询响应可以包含新创建的节点的所有字段,包括ID字段。

更新节点的操作类似,但是查询数据应包含节点ID。

嵌套的突变对于创建和更新节点是可能的。 结果,一个查询允许您创建或更新所有相关节点。 目前,最大嵌套级别为3。如果您需要更高的嵌套级别,则需要创建一个新查询。
要删除节点,您需要指定节点ID。 不幸的是,目前不支持嵌套和级联删除。

Graphcool模板
Graphcool支持模板系统以加快开发速度。 通过控制台添加的新模板可以被客户端立即使用。
模板通常不需要任何更改,但是,可以轻松进行任何必要的调整以适应您的方案。 模板的源代码已添加到您的工作目录中。 目前,官方模板的列表不多,以下是其中的一些:
- 电子邮件密码,Google,Facebook,Auth0的身份验证模板
- 邮件模板:mailgun,ses,push(推送通知)或twilio(SMS)。
也有非官方的模板。
Graphcool身份验证
基于令牌的模板用于Graphcool中的身份验证。 为您的应用程序启用了rootToken的使用。
使用授权系统,可以轻松创建权限规则并与身份验证集成。 Graphcool提供了非常灵活的基于功能的身份验证系统。
使用Graphcool,您可以识别需要身份验证的API操作。 执行操作的HTTP查询在其授权标头中应具有有效的身份验证令牌。 否则,由于无效的权限,查询将被中止。
Graphcool权限
权限在graphcool.yml中进行了描述。 在权限块内,您可以列出所需的权限类型。 可以对操作及其之间的关系进行限制。
要施加限制,您需要定义哪个操作仅限于某个节点。 接下来,确定可进行该操作的用户类型(是否经过授权)。 您可以选择要对其应用限制的某些节点字段,并标识特定的限制规则。
权限基于过滤系统。 只需为每个字段指定必要的值。 使用Graphcool,这样的查询将获取您当前用户的user_id以及正在检查的当前帐户的数据。

Graphcool的优缺点
让我们总结一下Graphcool的优缺点。
显然,有一些缺点:
- Graphcool生成的MySQL模式非常具体。 表之间没有关系。 这些关系包含在具有相关节点ID的表中。 在MySQL容器初始化后,Graphcool为元数据(项目ID和主要数据,用户功能,关系,webhooks和一些用户数据)创建一个数据库。 部署应用程序后,将创建一个单独的数据库,并使用生成的ID对其进行命名。 它包含在graphcool.yml中指定的表。 除了包含所描述节点的表之外,还有用于节点关系的表。

- 由于缺少关系,无法进行级联删除。
- 该项目对于开源来说是一个相当新的项目,文档尚待改进。
- IDE中没有用于语法支持的插件。 唯一可以节省的地方是具有GraphQL支持的Intellij IDEA插件。
现在是时候获得优势了:
- 开发速度极高。 只需定义方案,其余的由Graphcool完成。
- Graphcool可以利用使用JavaScript和TypeScript编写的解析器,从而扩大其潜力。
- 强大的过滤功能使您可以轻松获取必要的返回数据。
- Graphcool可以使用云存储中的文件。
- 模板提高了开发速度,并提供了可靠的解决方案。
- 学习曲线很低。 了解如何使用GraphQL创建方案,然后就可以开始工作了。
由于Graphcool是基于GraphQL的,因此它们具有大多数优点和缺点。 在某些方面,Graphcool越来越好,但是还有很长的路要走。
项目利用
在我们的研究过程中,决定使用PostgraphQL在实际项目中实施该框架,以比较这些技术。
创建了项目的主要节点和CRUD操作,实施了授权和高级共享系统(根据用户角色和组共享基础结构对象)。 开发后端花了3天。
由于Graphcool具有开箱即用的嵌套突变和灵活的过滤系统,因此无需创建自定义解析器,并且仅使用框架的功能即可实现所有功能。
Graphcool对比Postgraphql
- 自定义端点。 Graphcool几乎没有限制,可以使用JS。 PostgraphQL受数据库限制。
- 创建或更新。 Postgres中有Upsert,但您不能在PostgraphQL中使用它。 在Graphcool中是开箱即用的。
- 嵌套突变。 PostgraphQL不会创建或更新相关节点,只能通过单独的查询来完成。
- 原始SQL查询。 当前,Graphcool无法为GraphQL方案映射数据库方案。
- 过滤。 Graphcool提供了广泛的设置,可以比较行,日期,数组,而PostgraphQL仅可以比较键或值。
- 自动化。 Graphcool具有用于createdAt / updatedAt字段,关系操作的自动触发器。 在PostgraphQL中需要手动执行相同的操作。
- 计算字段。 Graphcool目前不支持计算字段。 仅通过单独的解析器支持它们。
- 级联删除。 由于数据库的特殊性,Graphcool不支持级联删除。
- 数据聚合。 Graphcool不能与可以根据您的需要聚合数据的内部数据库功能一起使用。
结论
如您所见,Graphcool是一个有趣且功能强大的框架。 但是,由于它只是在最近才开源,因此仍然存在一些需要开发人员和用户合作解决的问题。
这项工作将继续确保其他数据库的支持,数据聚合和级联删除。
作为开发人员,我认为Graphcool最适合中小型项目和快速原型设计,因为它提供了许多现成的功能(嵌套突变,灵活的过滤系统,模板,用JS / TS编写的自定义突变)并且不需要深入的SQL知识。
最后的话
我需要提及的是,我是这篇文章的合著者。 可以在这里找到原始文章的链接https://freshcodeit.com/blog/2017/12/26/graphcool-framework-analysis-and-practical-cases/ 。
确保在此链接https://freshcodeit.com/上访问FreshCode IT公司的网站,在其博客上可以找到很多很棒的文章。
谢谢阅读。
From: https://hackernoon.com/graphcool-framework-analysis-and-its-use-case-319173a9aea4