Workflows 允许你使用 Workers 平台构建持久、多步骤应用。Workflow 可以自动重试、持久化状态、运行数小时或数天,并协调第三方 API 之间的交互。
你可以构建 Workflows 来处理上传到 R2 对象存储 的文件、自动化生成 Workers AI 嵌入到 Vectorize 向量数据库,或使用 Email Service 触发用户生命周期邮件。
在本指南中,你将创建并部署一个获取数据、暂停并处理结果的 Workflow。
如果你想跳过步骤并拉取本指南中构建的完整 Workflow,请运行:
npm create cloudflare@latest workflows-starter -- --template "cloudflare/workflows-starter"如果你熟悉 Cloudflare Workers 或希望先探索代码再了解细节,请使用此选项。
按照以下步骤学习如何从头构建 Workflow。
- 注册 Cloudflare 账户 ↗。
- 安装
Node.js↗。
Node.js 版本管理器
使用 Volta ↗ 或 nvm ↗ 等 Node 版本管理器,以避免权限问题并切换 Node.js 版本。本指南后续将介绍的 Wrangler 需要 Node 版本 16.17.0 或更高。
-
打开终端并运行
create cloudflare(C3) CLI 工具创建 Worker 项目:npm create cloudflare@latest -- my-workflowyarn create cloudflare my-workflowpnpm create cloudflare@latest my-workflow进行设置时,请选择以下选项:
- 对于 What would you like to start with?,选择
Hello World example。 - 对于 Which template would you like to use?,选择
Worker only。 - 对于 Which language do you want to use?,选择
TypeScript。 - 对于 Do you want to use git for version control?,选择
Yes。 - 对于 Do you want to deploy your application?,选择
No(部署前我们还会做一些修改)。
- 对于 What would you like to start with?,选择
-
进入新项目目录:
cd my-workflowC3 创建了哪些文件?
在项目目录中,C3 将生成以下内容:
wrangler.jsonc:你的 Wrangler 配置文件。src/index.ts:用 TypeScript 编写的最小 Worker。package.json:最小 Node 依赖配置文件。tsconfig.json:TypeScript 配置。
-
创建新文件
src/workflow.ts:src/workflow.tsts import { WorkflowEntrypoint, WorkflowStep } from "cloudflare:workers"; import type { WorkflowEvent } from "cloudflare:workers"; type Params = { name?: string }; type IPResponse = { result: { ipv4_cidrs: string[] } }; export class MyWorkflow extends WorkflowEntrypoint<Env, Params> { async run(event: WorkflowEvent<Params>, step: WorkflowStep) { const data = await step.do("fetch data", async () => { const response = await fetch( "https://api.cloudflare.com/client/v4/ips", ); return await response.json<IPResponse>(); }); await step.sleep("pause", "20 seconds"); const result = await step.do( "process data", { retries: { limit: 3, delay: "5 seconds", backoff: "linear" } }, async () => { return { name: event.payload.name ?? "World", ipCount: data.result.ipv4_cidrs.length, }; }, ); return result; } }Workflow 扩展
WorkflowEntrypoint并实现run方法。此代码还将Params类型作为类型参数传递,以便触发 Workflow 的事件具有类型。step对象是 Workflows API 的核心。它提供在 Workflow 中定义持久步骤的方法:step.do(name, callback)- 执行代码并持久化结果。如果 Workflow 被中断或重试,它从最后一个成功步骤恢复,而不是重新运行已完成的工作。回调返回可序列化数据,包括 JavaScript Workflows 中用于大型二进制输出的ReadableStream<Uint8Array>。step.sleep(name, duration)- 暂停 Workflow 指定时长(例如"10 seconds"、"1 hour")。
如果返回流,请返回新的、未锁定的
ReadableStream<Uint8Array>。不支持 BYOB 流和 BYOB 读取器。你可以向
step.do()传递重试配置以自定义故障处理方式。请参阅完整 step API 了解流要求、限制以及sleepUntil和waitForEvent等附加方法。决定是否将代码拆分为独立步骤时,问自己:「如果只有一部分失败,我希望所有代码重新运行吗?」独立步骤非常适合用于调用外部 API、查询数据库或从存储读取文件等操作——如果后续步骤失败,Workflow 可以使用已获取的数据从该点重试,避免冗余 API 调用或数据库查询。
有关如何定义 Workflow 逻辑的更多指导,请参阅 Workflows 规则。
-
打开
wrangler.jsonc(Workers 项目和 Workflow 的 Wrangler 配置文件),添加workflows配置:{ "$schema": "node_modules/wrangler/config-schema.json", "name": "my-workflow", "main": "src/index.ts", // Set this to today's date "compatibility_date": "2026-08-17", "observability": { "enabled": true }, "workflows": [ { "name": "my-workflow", "binding": "MY_WORKFLOW", "class_name": "MyWorkflow" } ] }"$schema" = "node_modules/wrangler/config-schema.json" name = "my-workflow" main = "src/index.ts" # Set this to today's date compatibility_date = "2026-08-17" [observability] enabled = true [[workflows]] name = "my-workflow" binding = "MY_WORKFLOW" class_name = "MyWorkflow"class_name必须与你的导出 class 匹配,binding是你在代码中访问 Workflow 的变量名(如env.MY_WORKFLOW)。如果希望同一 Workflow 按 recurring 间隔自动运行,在 Workflow 定义中添加
schedules:{ "$schema": "node_modules/wrangler/config-schema.json", "name": "my-workflow", "main": "src/index.ts", // Set this to today's date "compatibility_date": "2026-08-17", "workflows": [ { "name": "my-workflow", "binding": "MY_WORKFLOW", "class_name": "MyWorkflow", "schedules": ["0 * * * *"] } ] }"$schema" = "node_modules/wrangler/config-schema.json" name = "my-workflow" main = "src/index.ts" # Set this to today's date compatibility_date = "2026-08-17" [[workflows]] name = "my-workflow" binding = "MY_WORKFLOW" class_name = "MyWorkflow" schedules = [ "0 * * * *" ]每个匹配的 cron 表达式会自动创建新的 Workflow 实例,因此你无需顶层
triggers.crons和单独的scheduled处理程序来运行 Workflow 特定的 recurring 任务。调度的实例在
event.schedule上包含匹配的 cron 表达式和调度触发时间。配置 Workflow 调度时请使用最新 Wrangler 版本。如果本地 Wrangler schema 尚不识别
schedules,请在部署前更新 Wrangler。你也可以在 Workflow 内通过
this.env访问绑定(binding)(如 KV、R2 或 D1)。有关 Workers 内绑定的更多信息,请参阅 绑定 (env)。 -
现在,为绑定生成类型:
npx wrangler types这将创建包含
MY_WORKFLOW绑定的Env类型的worker-configuration.d.ts文件。
现在,你需要一个地方来调用 Workflow。
-
将
src/index.ts替换为 fetch 处理程序,以启动和检查 Workflow 实例:src/index.tsts export { MyWorkflow } from "./workflow"; export default { async fetch(request: Request, env: Env): Promise<Response> { const url = new URL(request.url); const instanceId = url.searchParams.get("instanceId"); if (instanceId) { const instance = await env.MY_WORKFLOW.get(instanceId); return Response.json(await instance.status()); } const instance = await env.MY_WORKFLOW.create(); return Response.json({ instanceId: instance.id }); }, } satisfies ExportedHandler<Env>;
-
启动本地开发服务器:
npx wrangler dev -
要启动 Workflow 实例,打开新终端窗口并运行:
curl http://localhost:8787将自动生成
instanceId:{ "instanceId": "abc-123-def" } -
使用返回的
instanceId检查状态:curl "http://localhost:8787?instanceId=abc-123-def"Workflow 将依次执行各步骤。约 20 秒(sleep 时长)后将完成。
-
部署 Workflow:
npx wrangler deploy使用相同的 curl 命令针对已部署 URL 在生产环境测试。你也可以通过 Workers、Wrangler 或 Cloudflare 仪表板触发生产环境中的 workflow 实例。
部署后,你也可以使用 CLI 检查 Workflow 实例:
npx wrangler workflows instances describe my-workflow latestinstances describe的输出显示:- 每个步骤的状态(成功、失败、运行中)
- 步骤发出的任何状态。对于流式输出,CLI 显示预览或摘要而非完整内容。
- 任何
sleep状态,包括 Workflow 何时唤醒 - 与每个步骤关联的重试
- 错误,包括异常消息