我想说什么
- 自己实现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 |
首先,使用
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: |
但是,由于它在我的环境中不支持
只需按
在PostgreSQL
中创建表
必须创建一个PostgreSQL表来存储GraphQL所获取的数据。
当然,当连接到现有数据库时,此过程不是必需的。
如果您正在运行docker-compose,则应该可以使用
首先,创建一个表来存储要由GraphQL采集的数据。
单击屏幕顶部的
(顺便说一下,屏幕是由React制成的)
单击
屏幕中央的`
接下来,创建一个事件表,该事件表将是创建的社区中的子表,如下所示。
重要的是
创建表关系
定义创建的社区表和事件表之间的关系,以便GraphQL可以解释它。首先,在事件表中创建
现在,您已经设置了
这样就完成了表定义。当然,如果您需要从事件表中引用社区表的GraphQL查询,则还需要反向注册关系。
运行GraphQL
您可以通过打开
屏幕顶部的
GraphQL Server已像
一样完成。编写SQL来缩小数据范围(
当然,您也可以搜索
使用普通CRUD实施起来非常容易。
认证?授权
认证
如果需要身份验证,则可以使用webhook实施。
https://docs.hasura.io/1.0/graphql/manual/auth/index.html
当然,您可以对通过Webhook收到的身份验证进行任何操作,但是只要可以实施,就可以使用AWS cognito或firebase。
授权
授权在某种程度上似乎是可定义的。
https://docs.hasura.io/1.0/graphql/manual/auth/common-roles-auth-examples.html
在下面用示例编写设置示例。
例如,如果您知道要使用Webhook授权的用户ID,则要假定要显示仅该用户可以看到的数据。
首先,将
接下来,打开
在当前设置中,如果http头未添加任何内容,则将获取所有数据,因此可以如下所示获取所有数据。
但是,如果在
但是,如果尝试同时获取子表的数据,则会发生错误。
这是因为由于未为事件数据设置授权权限而导致无法获取数据而发生错误。因此,将授权设置添加到事件表中。
这次,由于数据引用是由社区表的
打开
如果您设置为将数据从最后一个事件表的
这样,您将能够正常获取事件表的数据。
实际使用
时将出现的其他要求
如果需要聚合函数,则可以定义视图。
https://docs.hasura.io/1.0/graphql/manual/queries/aggregations.html
*如果在实践中似乎还有其他必要,我将在此处添加。
最后
这就是创建GraphQL API所需要的,因此构建后端非常容易。即使是专门从事前台工作的工程师也可以在一定程度上进行构建。 AWS AppSync也不错,但是您将要使用RDBMS构建GraphQL,以使现有数据与GraphQL兼容并使搜索更可靠。
但是,正如我所写,普通的CRUD可以很容易地构造,但是在某些情况下,客户端在保存聚合数据时必须执行聚合处理,因此在某些情况下,您希望在应用程序实现方面避免使用它,所以不要认为关于这种情况,那不是很好。
在这种情况下,或者如果您想从多个微服务中获取数据,将其添加并返回给客户端,那么以像Prisma这样的方式设置GraphQL Server进行外部公开并在其中进行处理会更好吗?