[ PROMPT_NODE_24496 ]
Workflows 配置说明
[ SKILL_DOCUMENTATION ]
# 工作流配置
## wrangler.jsonc 设置
c
{
"name": "my-worker",
"main": "src/index.ts",
"compatibility_date": "2025-01-01", // 新项目使用当前日期
"observability": {
"enabled": true // 启用工作流仪表板 + 结构化日志
},
"workflows": [
{
"name": "my-workflow", // 工作流名称
"binding": "MY_WORKFLOW", // 环境绑定
"class_name": "MyWorkflow" // TS 类名
// "script_name": "other-worker" // 用于跨脚本调用
}
],
"limits": {
"cpu_ms": 300000 // 最大 5 分钟(默认 30 秒)
}
}
## 步骤配置
typescript
// 基础步骤
const data = await step.do('step name', async () => ({ result: 'value' }));
// 带重试配置
await step.do('api call', {
retries: {
limit: 10, // 默认:5 或 Infinity
delay: '10 seconds', // 默认:10000ms
backoff: 'exponential' // constant | linear | exponential
},
timeout: '30 minutes' // 每次尝试的超时时间(默认:10min)
}, async () => {
const res = await fetch('https://api.example.com/data');
if (!res.ok) throw new Error('Failed');
return res.json();
});
### 并行步骤
typescript
const [user, settings] = await Promise.all([
step.do('fetch user', async () => this.env.KV.get(`user:${id}`)),
step.do('fetch settings', async () => this.env.KV.get(`settings:${id}`))
]);
### 条件步骤
typescript
const config = await step.do('fetch config', async () =>
this.env.KV.get('flags', { type: 'json' })
);
// ✅ 确定性(基于步骤输出)
if (config.enableEmail) {
await step.do('send email', async () => sendEmail());
}
// ❌ 非确定性(步骤外的 Date.now)
if (Date.now() > deadline) { /* 错误 */ }
### 动态步骤(循环)
typescript
const files = await step.do('list files', async () =>
this.env.BUCKET.list()
);
for (const file of files.objects) {
await step.do(`process ${file.key}`, async () => {
const obj = await this.env.BUCKET.get(file.key);
return processData(await obj.arrayBuffer());
});
}
## 多工作流
c
{
"workflows": [
{"name": "user-onboarding", "binding": "USER_ONBOARDING", "class_name": "UserOnboarding"},
{"name": "data-processing", "binding": "DATA_PROCESSING", "class_name": "DataProcessing"}
]
}
每个类都继承自 `WorkflowEntrypoint` 并拥有自己的 `Params` 类型。
## 跨脚本绑定
Worker A 定义工作流。Worker B