ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Automatisch 集成 Appwrite 触发器详解:New documents 轮询机制的配置与实现原理

Automatisch 集成 Appwrite 触发器详解:New documents 轮询机制的配置与实现原理 Automatisch 集成 Appwrite 触发器详解New documents 轮询机制的配置与实现原理【免费下载链接】automatischThe open source Zapier alternative. Build workflow automation without spending time and money.项目地址: https://gitcode.com/GitHub_Trending/au/automatisch导读本文聚焦开源工作流自动化平台 Automatisch 中 Appwrite 集成唯一的内置触发器New documents新文档讲解其在 Automatisch 编辑器中的配置方式、底层轮询实现机制与去重原理并结合仓库源码剖析触发器的动态数据源、请求构造与认证流程。读完本文你将能熟练配置该触发器监听 Appwrite 指定集合的新增文档并理解其基于游标分页与internalId去重的工作方式为搭建数据库变更驱动的自动化流程打下基础。触发器总览文档定义的骨架在 Automatisch 官方文档中Appwrite 应用的触发器定义位于 packages/docs/pages/apps/appwrite/triggers.md其核心内容是一个触发器条目字段值nameNew documentsdescTriggers when a new document is created.当新文档被创建时触发文档通过CustomListing组件将触发器条目渲染到应用详情页中对应的元数据声明了该应用的 favicon 为/favicons/appwrite.svg。也就是说Appwrite 集成对外暴露的触发器只有 New documents 一个这从源码 triggers/index.js 中也可以得到印证——该文件导出的数组只包含newDocuments一个触发器。认识触发器的核心配置参数当你在 Automatisch 流程编辑器中选择 Appwrite 应用的New documents触发器后需要配置两个必填参数它们共同决定了监听哪个位置的新文档Database数据库labelDatabasekeydatabaseIdtypedropdown下拉选择requiredtrue必填sourcegetDynamicData动态数据源key 为listDatabases该下拉框的选项由动态数据源listDatabases实时拉取不需要手动填写数据库 ID。Collection集合labelCollectionkeycollectionIdtypedropdown下拉选择requiredtrue必填dependsOn[parameters.databaseId]依赖已选的数据库sourcegetDynamicData动态数据源key 为listCollections并携带parameters.databaseId参数该下拉框依赖上一步选择的 Database只有先选定数据库后Automatisch 才会拉取该数据库下的集合列表供你选择。两个参数都开启了variables: true意味着你可以在参数值中引用流程中的动态变量如上一个步骤的输出。完整的参数定义见 triggers/new-documents/index.js。动态数据源下拉选项从哪里来两个下拉框的选项并非静态写死而是由 Appwrite 应用的dynamic-data模块在运行时查询真实数据listDatabases列出所有数据库list-databases/index.js 的实现会调用 Appwrite 的GET /v1/databases接口并携带两条查询orderAsc按name属性升序排列limit100最多返回 100 个。随后将每个数据库映射为{ value: $id, name }结构返回其中$id作为下拉框提交的值。listCollections按数据库列出集合list-collections/index.js 会先读取当前步骤参数$.step.parameters.databaseId如果尚未选择数据库则直接返回空列表否则调用GET /v1/databases/${databaseId}/collections同样使用orderAsc按name排序和limit100 的查询返回集合的$id与name映射。这种先查数据库、再按数据库查集合的两级联动动态数据源保证了用户在下拉框中看到的永远是与自己 Appwrite 项目实时同步的有效 ID避免了手动输入拼写错误导致流程失败。New documents 轮询机制源码解析New documents 是一个轮询polling型触发器而不是 Webhook。其定义位于 triggers/new-documents/index.js核心字段pollInterval: 15表示 Automatisch 每15 秒向 Appwrite 发起一次轮询请求。这一点也受 helpers/define-trigger.js 的约束——defineTrigger会校验触发器必须带有pollInterval或是 webhook 类型否则直接抛出异常。轮询请求的构造每次轮询触发器读取步骤参数中的databaseId与collectionId向 Appwrite 发起GET /v1/databases/{databaseId}/collections/{collectionId}/documents并携带一组 JSON 序列化的查询参数{ method: orderDesc, attribute: $createdAt }——按创建时间$createdAt降序保证最新创建的文档排在最前{ method: limit, values: [1] }——每批只取 1 条当存在上次游标时追加{ method: cursorAfter, values: [lastDocumentId] }——用上一次最后一条文档的$id作为游标继续向后翻页。其中cursorAfter有一个细节代码注释明确写着An invalid cursor shouldnt be sent不应发送无效游标因此在没有lastDocumentId时该查询会被过滤掉.filter(Boolean)避免向 API 发送非法游标。分页与去重机制触发器通过do...while循环实现游标分页每次请求后记录documentCount本批返回条数与lastDocumentId本批最后一条文档的$id当本批返回条数等于limit即 1时继续翻页直到某批返回空为止确保一次轮询能完整扫完所有新增文档若某批返回为空直接return结束本轮。对于每条文档调用$.pushTriggerItem推入触发事件$.pushTriggerItem({ raw: document, meta: { internalId: document.$id, }, });这里的关键是meta.internalId document.$id。Automatisch 引擎以internalId作为去重依据同一份文档在一次轮询中被发现后会被记录后续轮询即使再次读到该文档也不会重复触发执行。这保证了每个新文档只触发一次流程且天然免疫网络抖动、重复请求带来的重复执行问题。在流程执行记录中raw字段则完整承载了该文档的全部数据供后续步骤如发送通知、写回数据使用。认证与请求头轮询请求之所以能成功依赖于 Appwrite 连接Connection中保存的认证信息。Appwrite 应用在 index.js 中注册了两个beforeRequest钩子setBaseUrlcommon/set-base-url.js如果连接中填写了自定义instanceUrl则将其作为请求baseURL适配自托管 Appwrite否则回退到应用的apiBaseUrl即https://cloud.appwrite.ioAppwrite Cloud。addAuthHeadercommon/add-auth-header.js为请求设置Content-Type: application/json并从连接数据中读取projectId、apiKey与host分别写入X-Appwrite-Project、X-Appwrite-Key与Host请求头——这正是 Appwrite REST API 的认证方式。连接凭证字段与校验要使用 New documents 触发器你需要在 Automatisch 中先为 Appwrite 创建连接。认证字段定义见 auth/index.js字段 keylabel必填说明screenNameScreen Name是连接在 UI 中显示的名称projectIdProject ID是Appwrite 项目的 IDapiKeyAPI Key是Appwrite 项目的 API KeyinstanceUrlAppwrite instance URL否自托管实例地址留空则默认使用https://cloud.appwrite.iohostHost Name是Appwrite 项目的 Host 名创建连接时verify-credentials.js 会通过一次GET /v1/users请求校验凭证有效性——如果该请求返回非 2xx则连接创建失败从源头保证后续触发器不会因无效凭证而反复报错。实战场景与构建建议结合以上机制New documents 触发器适合以下自动化场景数据变更通知Appwrite 集合中新增一条订单/工单文档后自动通过 Slack、邮件或 Telegram 通知相关人员数据同步新文档写入后调用其他应用如 Google Sheets、Airtable同步记录后续处理流水线新文档触发后经过过滤/格式化步骤调用 HTTP Request 或 AI 应用对内容做进一步加工。实际构建时注意三点其一触发器采用 15 秒固定轮询间隔对实时性要求极高的场景需评估延迟可接受度其二Database 与 Collection 下拉框由动态数据源实时填充请确认连接凭证对应的账号对目标数据库、集合具备读取权限其三internalId去重基于文档$id若业务上需要同一文档被更新后再触发则需要结合其他应用如 Webhook 或定时触发器设计增量方案因为 New documents 仅面向新增文档。参考文件索引官方文档定义packages/docs/pages/apps/appwrite/triggers.md触发器实现packages/backend/src/apps/appwrite/triggers/new-documents/index.js触发器注册packages/backend/src/apps/appwrite/triggers/index.jsApp 应用定义packages/backend/src/apps/appwrite/index.js连接认证字段与校验packages/backend/src/apps/appwrite/auth/index.js、packages/backend/src/apps/appwrite/auth/verify-credentials.js请求钩子packages/backend/src/apps/appwrite/common/set-base-url.js、packages/backend/src/apps/appwrite/common/add-auth-header.js动态数据源packages/backend/src/apps/appwrite/dynamic-data/list-databases/index.js、packages/backend/src/apps/appwrite/dynamic-data/list-collections/index.js触发器定义校验packages/backend/src/helpers/define-trigger.js【免费下载链接】automatischThe open source Zapier alternative. Build workflow automation without spending time and money.项目地址: https://gitcode.com/GitHub_Trending/au/automatisch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表