admin
对您的数据具有完全 CRUD 访问权限的角色。要限制对其他用户的访问,您需要创建其他角色,例如user
、public
或accountant
。对于您创建的每个角色,您需要为以下操作定义访问策略:
您可以定义三种类型的策略:
以下示例演示了角色的select
授权策略。user
设置下面定义的规则是为了确保 auser
只能查询自己的记录或标记为公共的记录:
设计架构和定义权限后,您可以直接在 Hasura 的 API 仪表板中测试 GraphQL 查询。只要启用了跟踪,就可以查询您定义的每个表、视图和关系。
您可以执行的查询类型包括:
GraphQL 查询结果可以排序、分组和分页。还支持基于光标的分页。基本上,任何可以在 PostgreSQL 上运行的 SQL 语句都可以通过 GraphQL 查询公开。在下一节中,我们将研究突变。
GraphQL 突变是用于修改数据的语句。以下是您可以执行的突变类型:
mutation insert_single_article {
insert_article_one(
object: {
title: "Article 1"
content: "Sample article content"
author_id: 3
}
) {
id
title
}
}
value
具有唯一约束: mutation upsert_single_tag {
insert_tags(
objects: { value: "Java" }
on_conflict: { constraint: tags_value_key, update_columns: value }
) {
returning {
id
value
}
}
}
int
的特殊运算符。jsonb
下面的示例更新所有评分小于或等于2 的文章。突变将返回受影响的行数,并将这些行列为对象数组: mutation update_article {
update_article(
where: { rating: { _lte: 2 } }
_set: { rating: 1, is_published: false }
) {
affected_rows
returning {
id
title
content
rating
is_published
}
}
}
mutation delete_an_object {
delete_article_by_pk(id: 1) {
id
title
user_id
}
}
mutation reset_author {
delete_article(where: { author_id: { _eq: 6 } }) {
affected_rows
}
update_author(where: { id: { _eq: 6 } }, _set: { name: "Cory" }) {
returning {
id
name
articles {
id
title
}
}
}
}
订阅
Hasura 的订阅是通过WebSocket 协议执行的实时查询。这是一种用于从数据库中获取实时数据的协议。任何 GraphQL 查询都可以通过简单地将关键字替换为订阅。默认情况下,此类查询每秒运行一次 SQL 语句。这是一个可配置的设置,可以对其进行调整以在数据库负载和延迟之间提供适当的平衡。如果基础数据发生变化,则将新值推送到客户端。querysubscription
以下示例演示了跟踪车辆位置的 GraphQL 订阅:
# $vehicleId = 3
subscription getLocation($vehicleId: Int!) {
vehicle(where: { id: { _eq: $vehicleId } }) {
id
vehicle_number
locations(order_by: { timestamp: desc }, limit: 1) {
location
timestamp
}
}
}
使用订阅的其他用例包括:
通常在构建现代应用程序时,您需要与第三方 API 集成:
这些第三方 API 通常直接从客户端应用程序访问。使用 Hasura,您可以将这些 API 与您的数据库合并以创建统一的 GraphQL API。这创造了新的机会,您可以在其中实现授权并定义表/视图与远程 API 之间的远程关系。您还可以创建基于此类关系执行特定任务的操作。
拥有统一的 GraphQL API 可以让前端开发人员更轻松地构建应用程序。在下一节中,我们将了解 Hasura Actions 是什么。
Hasura 中的自定义业务逻辑通过 webhook 在微服务或无服务器功能上进行外部处理。这意味着您可以使用您喜欢的任何语言编写自定义逻辑,例如 Node.js、Python、Go 或 Ruby on Rails。Hasura 中的 Action 只是一个自定义 GraphQL 查询或突变,它映射到定义输入和输出接口的 webhook。
动作定义由以下部分组成:
让我们看一个简单的“Hello, World!” 例子。首先,我们定义一个 Action 查询如下:
type Query {
hello(name: String!): HelloResponse
}
上面的 Action 定义了一个名为的函数,该函数hello
接受一个称为name
输入的字符串变量。该函数返回一个HelloResponse
对象,它是一个自定义类型,定义如下:
type HelloResponse {
message: String!
}
定义好接口后,剩下的就是实现 webhook 服务和 Hasura 实例可访问的 URL。这是在 Hasura 的 CodeGen 助手的帮助下为 Express.js 编写的实现:
// Request Handler
app.post("/hello", async (req, res) => {
// get request input
const { name } = req.body.input;
// success
return res.json({
message: `Hello, ${name}!`,
});
});
事件触发器
在 Hasura 中,您可以使用称为事件驱动编程的软件架构来构建应用程序。这是一种设计模式,将复杂的状态管理与单一后端分离,并将其交给执行业务逻辑的单个微服务或无服务器功能。这允许构建高度健壮和可扩展的应用程序。
通过事件编程,您可以轻松处理许多用例,例如:
发送电子邮件
发送推送通知
将新数据发送到您的Algolia 搜索索引
在 PostgreSQL 中,您可以创建触发器,以在诸如INSERT、UPDATE或等事件DELETE发生时执行 SQL 语句或存储过程。触发器与表或视图相关联,可以在事件之前或之后触发。
在 Hasura 中,事件触发器的定义类似,用于在触发事件时调用web 挂钩。这个上下文中的 web hook 与我们刚刚在“操作”部分讨论的非常相似。事件触发器也可以通过控制台或 API 手动调用。
以下是 YAML 格式的事件触发器定义示例:
- table:
schema: public
name: author
event_triggers:
- name: author_trigger
definition:
enable_manual: false
insert:
columns: "*"
update:
columns: "*"
webhook: https://httpbin.org/post
事件触发器可以使用标头定义(用于身份验证),并且通常包含发送到 webhook 服务以进行数据处理的有效负载。唯一期望的响应是200状态。如果需要,实际结果会通过不同的路径发回——例如发布 GraphQL 突变,或发送电子邮件通知等。
前端应用可以通过 GraphQL 订阅进行查询来接收结果。这种架构可以轻松构建具有出色用户体验的非阻塞交互式实时应用程序。代码库也更容易为开发人员维护、测试和扩展。
预定触发器
计划触发器是基于时间的事件,通过 webhook 执行自定义业务逻辑。您可以定义两种类型:
CRON 触发器:用于定期发生的周期性事件
一次性预定事件:用于一次性执行
可以通过 Web 控制台或元数据 API 创建计划的触发器。下面的屏幕截图显示了 Web 控制台示例。
元数据 API 允许使用应用程序代码创建计划事件。下面的示例显示了如何使用 API 构建一次性事件的创建:
{
"type": "create_scheduled_event",
"args": {
"webhook": "https://my-awesome-serverless-fn.com/send-email",
"schedule_at": "2022-07-20T12:45:00Z",
"payload": {
"email": "[email protected]"
}
}
}
Hasura 提供了许多容错机制来确保计划的触发器成功运行。例如,假设计划在下午 2:00 进行的事件未处理,因为 Hasura 在下午 1:59 关闭。当 Hasura 重新上线时,它将根据可自定义的容差配置重新处理事件并重新运行错过的预定触发器。默认设置为六小时。
Hasura 还提供了灵活的重试配置,以防 HTTP 失败。您可以配置重试次数和每次重试之间的超时时间。每次触发调用都会被记录——您可以稍后访问以进行检查。
预定触发器的用例包括:
发送提醒
生成日终报告
删除过去 90 天内未验证其电子邮件地址的非活动用户
迁移和环境
任何软件项目的理想开发工作流程是为开发、登台和生产设置多个环境。此工作流程简化了测试并确保开发人员在部署其软件的新版本时不会意外删除或损坏生产数据。
为了将开发环境的状态转移到登台和生产,需要迁移文件。使用 Hasura,您将需要:
数据库/SQL 迁移文件
Hasura 元数据
Hasura 元数据由配置文件的快照组成,这些文件跟踪:
关系
权限
触发器
行动
GraphQL 架构
远程模式
您需要安装Hasura CLI才能创建这些迁移文件并将其应用到不同的 Hasura 实例。这些迁移文件可以在开发过程中随着模式的变化而进行版本控制和增量更新。
使用命令创建和应用 SQL 迁移文件hasura migrate,而使用命令处理元数据迁移文件hasura metadata。CLI 命令还使您能够:
回滚应用的迁移
创建种子数据迁移
重置迁移文件
squash 迁移文件——也就是说,用一个主要更新替换小的增量更新
Hasura 有一个特殊的 Docker cli-migration 镜像,可以在服务器启动时自动应用迁移。此图像还包含Hasura CLI工具,可用于在您的工作流程中运行 CI/CD 脚本。
部署
将 Hasura 部署到生产环境的最简单方法是使用Hasura Cloud。这是推荐的选项,因为您可以获得开源版本中不可用的企业功能。幸运的是,与大多数后端即服务提供商 (BaaS) 不同,Hasura 不会将您锁定在他们的平台上。您可以在以下平台中利用一键部署服务提供商:
Heroku
数字海洋
使成为
天蓝色
您还可以在任何Kubernetes 平台上部署 Hasura,例如Google Cloud。AWS也受支持,但您必须通过许多步骤才能使其正常工作。外部托管确实为您提供了自由和更多的定价选择。但是,以上所有选项都要求您为以下各项设置附加服务:
验证
贮存
自定义业务逻辑
在下一节中,我们将简要介绍如何使用 NHost 来进一步简化 Hasura 后端应用程序的开发。
使用 NHost 部署
NHost 是一家开源 BaaS 提供商,旨在与Firebase等平台竞争。他们的后端堆栈包括:
PostgreSQL 数据库
Hasura GraphQL 引擎
身份验证服务
MinIO , S3 兼容的对象存储服务
无服务器功能(目前处于测试阶段)
该平台带有一个名为的客户端库nhost-js-sdk,用于前端身份验证和文件管理。存储服务支持图片优化,免去了我们为图片集成其他服务的麻烦。
在撰写本文时,NHost 目前为其服务提供 14 天的试用期。免费层将很快推出。有一个名为Hasura Backend Plus的 Docker 版本,您可以在本地机器上部署它。