你可以通过部署包含 Workflow 定义的 Workers 项目,然后使用 service bindings 或标准 fetch() 调用该 Worker,从 Pages Functions 绑定并触发 Workflows。
Service Bindings 允许你从另一个 Worker 或 Pages Function 调用 Worker,而无需直接暴露它。
为此,你需要:
- 在 Worker 中部署 Workflow
- 在 Pages 项目中创建到该 Worker 的 Service Binding
- 使用绑定远程调用 Worker
例如,如果你有一个名为 workflows-starter 的 Worker,你需要在 Pages 项目中创建新的 Service Binding,如下所示,确保 service 名称与定义 Workflow 的 Worker 名称匹配:
{
"services": [
{
"binding": "WORKFLOW_SERVICE",
"service": "workflows-starter"
}
]
}[[services]]
binding = "WORKFLOW_SERVICE"
service = "workflows-starter"你的 Worker 可以暴露特定方法(或多个方法),只有其他 Workers 或 Pages Functions 可以通过 Service Binding 调用。
在以下示例中,我们暴露特定的 createInstance 方法,接受 Payload 并返回 Workflows API 的 InstanceStatus:
import { WorkerEntrypoint } from "cloudflare:workers";
export default class WorkflowsService extends WorkerEntrypoint {
// 目前,没有命名处理程序的 entrypoint 不受支持
async fetch() {
return new Response(null, { status: 404 });
}
async createInstance(payload) {
let instance = await this.env.MY_WORKFLOW.create({
params: payload,
});
return Response.json({
id: instance.id,
details: await instance.status(),
});
}
}import { WorkerEntrypoint } from "cloudflare:workers";
interface Env {
MY_WORKFLOW: Workflow;
}
type Payload = {
hello: string;
};
export default class WorkflowsService extends WorkerEntrypoint<Env> {
// 目前,没有命名处理程序的 entrypoint 不受支持
async fetch() {
return new Response(null, { status: 404 });
}
async createInstance(payload: Payload) {
let instance = await this.env.MY_WORKFLOW.create({
params: payload,
});
return Response.json({
id: instance.id,
details: await instance.status(),
});
}
}你的 Pages Function 将类似于:
export const onRequest = async (context) => {
// 此 payload 可以来自应用内或前端
let payload = { hello: "world" };
return context.env.WORKFLOWS_SERVICE.createInstance(payload);
};interface Env {
WORKFLOW_SERVICE: Service;
}
export const onRequest: PagesFunction<Env> = async (context) => {
// 此 payload 可以来自应用内或前端
let payload = { hello: "world" };
return context.env.WORKFLOWS_SERVICE.createInstance(payload);
};要了解更多关于从 Pages Functions 绑定资源的信息,包括如何通过 Cloudflare 仪表板绑定,请参阅 Pages Functions 绑定文档。
设置 Service Binding 的替代方案是通过 HTTP 调用 Worker,使用 Workflows Workers API 为每个传入 HTTP 调用 create 新的 Workflow 实例:
// 这与 Workflow 定义在同一文件中
export default {
async fetch(req, env) {
let instance = await env.MY_WORKFLOW.create({
params: payload,
});
return Response.json({
id: instance.id,
details: await instance.status(),
});
},
};// 这与 Workflow 定义在同一文件中
export default {
async fetch(req: Request, env: Env): Promise<Response> {
let instance = await env.MY_WORKFLOW.create({
params: payload,
});
return Response.json({
id: instance.id,
details: await instance.status(),
});
},
};你的 Pages Function 然后可以向 Worker 发出常规 fetch 调用:
export const onRequest = async (context) => {
// 其他代码
let payload = { hello: "world" };
const instanceStatus = await fetch("https://YOUR_WORKER.workers.dev/", {
method: "POST",
body: JSON.stringify(payload), // 发送 payload 供 Worker 传递给 Workflow
});
return Response.json(instanceStatus);
};export const onRequest: PagesFunction<Env> = async (context) => {
// 其他代码
let payload = { hello: "world" };
const instanceStatus = await fetch("https://YOUR_WORKER.workers.dev/", {
method: "POST",
body: JSON.stringify(payload), // 发送 payload 供 Worker 传递给 Workflow
});
return Response.json(instanceStatus);
};你也可以选择在 header 中传递共享密钥并在 Worker 中验证,以对这些请求进行身份验证。
- 了解更多关于如何从 Workers API 以编程方式调用和触发 Workflows
- 了解触发 Workflow 时如何发送事件和参数
- 查看 Workflows 规则 和编写 Workflows 的最佳实践