Prisma还不错,但是Hasura GraphQL Engine也以超高速实现GraphQL Server


我想说什么

  • 自己实现GraphQL API很麻烦,所以我想依靠它并从中获得乐趣
  • Prisma很好,但是Hasura GraphQL Engine也适合PostgreSQL

  • 与Prisma不同,Hasura GraphQL Engine可以由客户端直接调用,但是如果要精心实现,则仍然需要专用于该客户端的GraphQL Server。

什么是Hasura GraphQL引擎?

Prisma构建了不仅支持PostgreSQL而且还支持其他RDBMS(例如MySQL)的GraphQL Server,而Hasura GraphQL Engine构建了专用于PostgreSQL的GraphQL Server。

如何建造

文档非常好,老实说,我认为没有必要写这篇文章。如果您对英语过敏,请参考我的日语文章,不胜感激。

Hasura GraphQL引擎设置

官方文档描述了两种类型,一种是制作Heroku,另一种是使用Docker(-compose),但是显然使用Docker更容易,因此本文将以此方式进行描述。

1
2
3
$ mkdir hasura_sample
$ cd hasura_sample
$ wget https://raw.githubusercontent.com/hasura/graphql-engine-install-manifests/master/docker-compose/docker-compose.yaml

首先,使用wget获取更新样本docker-compose.yml。内容没有特别详尽。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: '3.6'
services:
  postgres:
    image: postgres
    restart: always
    volumes:
    - db_data:/var/lib/postgresql/data
  graphql-engine:
    image: hasura/graphql-engine:v1.0.0-alpha13
    ports:
    - "8080:8080"
    depends_on:
    - "postgres"
    restart: always
    environment:
      HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:@postgres:5432/postgres
    command:
      - graphql-engine
      - serve
      - --enable-console
volumes:
  db_data:

但是,由于它在我的环境中不支持version 3.6,因此将其放置到version 3.3

只需按

docker-compose up,您就完成了。 (正式地,该守护程序是用-d启动的,但是由于我想查看该日志,因此它是在不启动该守护程序的情况下启动的。)

在PostgreSQL

中创建表

必须创建一个PostgreSQL表来存储GraphQL所获取的数据。
当然,当连接到现有数据库时,此过程不是必需的。
如果您正在运行docker-compose,则应该可以使用http://localhost:8080/console访问Hasura GraphQL Engine控制台。

image.png

首先,创建一个表来存储要由GraphQL采集的数据。
单击屏幕顶部的DATA选项卡以显示用于创建架构的屏幕。
(顺便说一下,屏幕是由React制成的)

image.png

单击

屏幕中央的`Create Table按钮,或单击左侧菜单中的Add Table打开架构定义屏幕。通过在此处输入所需信息来创建表。这次,作为示例,我们创建一个名为community的表,并准备3列idnamedescription作为列。 (我正在考虑使用Rails制作桌子)

image.png

接下来,创建一个事件表,该事件表将是创建的社区中的子表,如下所示。

image.png

重要的是community_id将关系与社区表放在一起。

创建表关系

定义创建的社区表和事件表之间的关系,以便GraphQL可以解释它。首先,在事件表中创建Foreign Key。打开创建的事件表,并在Modify选项卡上进行如下设置。

image.png

现在,您已经设置了Foreign Key,是时候创建从社区表到事件表的关系了。如果打开社区表并打开Relationships选项卡,则会找到Add按钮,因此单击它可以打开名称注册。这里的名称是从一个社区看到的事件数据,因此将其保留为events。简而言之,它是在GraphQL查询中获取1个社区的事件数据的名称,该名称将在以后使用。

image.png

这样就完成了表定义。当然,如果您需要从事件表中引用社区表的GraphQL查询,则还需要反向注册关系。

运行GraphQL

您可以通过打开

屏幕顶部的GRAPHQL选项卡来运行GraphQL。

image.png

GraphQL Server已像

一样完成。编写SQL来缩小数据范围(where)和排序(order_by)时,可以间隔使用它,这对我来说很容易理解。

image.png

当然,您也可以搜索like

使用普通CRUD实施起来非常容易。

认证?授权

认证

如果需要身份验证,则可以使用webhook实施。
https://docs.hasura.io/1.0/graphql/manual/auth/index.html

image.png

当然,您可以对通过Webhook收到的身份验证进行任何操作,但是只要可以实施,就可以使用AWS cognito或firebase。

授权

授权在某种程度上似乎是可定义的。
https://docs.hasura.io/1.0/graphql/manual/auth/common-roles-auth-examples.html

在下面用示例编写设置示例。
例如,如果您知道要使用Webhook授权的用户ID,则要假定要显示仅该用户可以看到的数据。

首先,将user_id作为创建者添加到创建的社区表中。
image.png

接下来,打开Permissions选项卡,添加角色user,然后将参数X-HASURA-USER-ID设置为仅显示与先前创建的user_id匹配的那些。调用GraphQL API时,必须将此X-HASURA-USER-ID作为HTTP标头添加。如果您使用webhook进行授权,则应在webhook的响应中进行设置。
image.png

在当前设置中,如果http头未添加任何内容,则将获取所有数据,因此可以如下所示获取所有数据。

image.png

但是,如果在user角色中设置用户ID,并在http标头中设置数据,则只能引用某些数据。

image.png

但是,如果尝试同时获取子表的数据,则会发生错误。

image.png

这是因为由于未为事件数据设置授权权限而导致无法获取数据而发生错误。因此,将授权设置添加到事件表中。
这次,由于数据引用是由社区表的user_id控制的,因此从事件表也可以做到这一点。因此,首先,从事件表创建社区表关系。

image.png

打开

Relationships选项卡,单击Add按钮,输入您的名称,然后完成。
如果您设置为将数据从最后一个事件表的Permissioins选项卡缩小到社区表的user_id,则此操作完成。

image.png

这样,您将能够正常获取事件表的数据。

image.png

实际使用

时将出现的其他要求

如果需要聚合函数,则可以定义视图。
https://docs.hasura.io/1.0/graphql/manual/queries/aggregations.html

*如果在实践中似乎还有其他必要,我将在此处添加。

最后

这就是创建GraphQL API所需要的,因此构建后端非常容易。即使是专门从事前台工作的工程师也可以在一定程度上进行构建。 AWS AppSync也不错,但是您将要使用RDBMS构建GraphQL,以使现有数据与GraphQL兼容并使搜索更可靠。
但是,正如我所写,普通的CRUD可以很容易地构造,但是在某些情况下,客户端在保存聚合数据时必须执行聚合处理,因此在某些情况下,您希望在应用程序实现方面避免使用它,所以不要认为关于这种情况,那不是很好。
在这种情况下,或者如果您想从多个微服务中获取数据,将其添加并返回给客户端,那么以像Prisma这样的方式设置GraphQL Server进行外部公开并在其中进行处理会更好吗?