跳转到内容
搜索文档

从 Pages 调用 Workflows

最后更新 查看 MarkdownAgent 设置

你可以通过部署包含 Workflow 定义的 Workers 项目,然后使用 service bindings 或标准 fetch() 调用该 Worker,从 Pages Functions 绑定并触发 Workflows。

使用 Service Bindings

Service Bindings 允许你从另一个 Worker 或 Pages Function 调用 Worker,而无需直接暴露它。

为此,你需要:

  1. 在 Worker 中部署 Workflow
  2. 在 Pages 项目中创建到该 Worker 的 Service Binding
  3. 使用绑定远程调用 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

index.jsjs
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(),
		});
	}
}
index.tsts
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 将类似于:

functions/request.jsjs
export const onRequest = async (context) => {
	// 此 payload 可以来自应用内或前端
	let payload = { hello: "world" };
	return context.env.WORKFLOWS_SERVICE.createInstance(payload);
};
functions/request.tsts
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 绑定文档

使用 fetch

设置 Service Binding 的替代方案是通过 HTTP 调用 Worker,使用 Workflows Workers API 为每个传入 HTTP 调用 create 新的 Workflow 实例:

index.jsjs
// 这与 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(),
		});
	},
};
index.tsts
// 这与 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 调用:

functions/request.jsjs
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);
};
functions/request.tsts
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 中验证,以对这些请求进行身份验证。

后续步骤

这篇文档对您有帮助吗?