如何在几分钟内向 dev.to 添加 GraphQL API
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
你为什么会读到这篇文章
- dev.to 拥有一个 REST API,该 API 可能在不久的将来向公众开放。
- GraphQL 现在是一项成熟可靠的技术,也是许多人在 2019 年想要熟悉的技术之一。
- PostgreSQL(dev.to 使用的数据库)是我最喜欢的关系型数据库。
我决定尝试Hasura,它承诺让人们构建一个可以直接与 PostgreSQL 数据库交互的 GraphQL API。
我没想到15分钟后就完成了我的演示,只写了GraphQL查询语句和一条SQL语句,完全没有其他代码。
让我先回顾一下,解释一下Hasura是什么。
哈苏拉
该工具是一个用 Haskell 和 JavaScript 编写的 GraphQL 引擎/服务器。它位于客户端应用程序(例如 API 使用者)和数据库(PostgreSQL)之间。
客户端发送 GraphQL 查询,服务器接收、解析、验证该查询,将其转换为高度优化的 SQL 查询,以 JSON 格式获取数据(PostgreSQL 允许您以 JSON 格式导出数据而无需返回到 Web 应用程序,在我看来,这是它最近最好的功能之一),然后将其发送回客户端。
如果您想了解更多关于架构的信息,可以阅读 Hasura 的文章:高性能 GraphQL 到 SQL 引擎的架构。
所以,在出于好奇读了那篇文章之后,我决定尝试一下,尽量少看文档。
一切顺利。
服务器设置
设置过程非常简单。我安装了适用于 Mac 的 Docker,下载了一个脚本,运行了脚本内容,然后等待:
docker run -p 8080:8080 -e HASURA_GRAPHQL_DATABASE_URL=postgres://username:password@host:port/db -e HASURA_GRAPHQL_ENABLE_CONSOLE=true hasura/graphql-engine:v1.0.0-alpha34
之后,我用浏览器打开了控制台,出现了以下信息:
准备模式
点击后Data会显示所选数据库中包含的表列表。我指示 Hasura 显示 `<table>` articles、` <table>`comments和users`<table>` 表,然后在用户界面中点击了几下以创建它们之间的关系,结果如下:
我唯一需要手动设置的内容是articles_comments默认 dev.to 数据库中不存在的内容。
Hasura不支持 Ruby on Rails 创建的多态关联。通过在问题跟踪器中搜索,找到了解决方案:创建一个简单的视图。
create view articles_comments as select * from comments where commentable_type = 'Article';
查询数据
有了架构和关系设置之后,我编写了一些带有和不带有嵌套数据的 GraphQL 查询,以查看一切是否正常。
最近 10 位用户及其最近的 3 条评论
最热门的文章、最热门的评论以及作者姓名
最后一个问题正是 GraphQL 优于 REST 的原因之一。当需要查询嵌套或相关数据时,REST(类)API 往往会显得有些笨拙。试想一下,我们要求 Web 服务器检索点赞数最多的帖子,然后再获取点赞数最多的评论及其作者。
在经典的 REST(类)API 中,您需要调用 HTTP Web 服务器三次:
- 请按受欢迎程度排序,给我这篇文章。
- 请按受欢迎程度排序,给我评论,这里我给你文章的ID。
- 请提供用户信息,我这里提供评论 ID。
在某些 REST API 中,你可能会遇到一次 HTTP 调用,但这只是一种可能性,并非默认情况。而 GraphQL 在这种情况下降低了门槛:
- 任何 GraphQL 客户端都可以与您的服务器通信,而无需使用您自己的 REST 版本。
- 往返行程只有一次
- API具有自文档化特性,这在探索阶段是一个巨大的优势。
在 Hasura 界面中点击“分析”按钮,即可显示 SQL 语句和执行计划:
我写到这里就停了下来,并写下了这篇文章。不过,Hasura 还支持许多其他功能:
- 突变
- 订阅(基本上是数据库中数据更改的实时通知,您可以将其连接到用户界面)
- 身份验证和行级访问控制(您可以决定公开哪些内容以及不公开哪些内容)
- 模式拼接(需要通过您的 API 透明地公开的外部 GraphQL API)
- 事件上的网络钩子
- 迁移
Hasura 也部署在 Heroku、Digital Ocean 和 Kubernetes 上。
我只试用了几分钟,所以还不能多说,但对于想要在现有数据库之上构建 GraphQL API 的人来说,这无疑是一个有趣的工具。
文章来源:https://dev.to/rhymes/how-to-add-a-graphql-api-to-devto-in-a-few-minutes-10a9




