发布于 2026-01-06 7 阅读
0

如何在几分钟内将 GraphQL API 添加到 dev.to DEV 的全球展示挑战赛,由 Mux 呈现:展示你的项目!

如何在几分钟内向 dev.to 添加 GraphQL API

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

你为什么会读到这篇文章

我决定尝试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
Enter fullscreen mode Exit fullscreen mode

之后,我用浏览器打开了控制台,出现了以下信息:

准备模式

点击后Data会显示所选数据库中包含的表列表。我指示 Hasura 显示 `<table>` articles、` <table>`commentsusers`<table>` 表,然后在用户界面中点击了几下以创建它们之间的关系,结果如下:

我唯一需要手动设置的内容是articles_comments默认 dev.to 数据库中不存在的内容。

Hasura不支持 Ruby on Rails 创建的多态关联。通过在问题跟踪器中搜索,找到了解决方案:创建一个简单的视图。

create view articles_comments as select * from comments where commentable_type  = 'Article';
Enter fullscreen mode Exit fullscreen mode

查询数据

有了架构和关系设置之后,我编写了一些带有和不带有嵌套数据的 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