跳转到内容
搜索文档

多 Workers (Multiple Workers)

最后更新 查看 MarkdownAgent 设置

Miniflare 允许你在同一个实例中运行多个 Worker。所有的 Worker 都可以通过 workers 选项在同一个层级上定义。

下面是一个使用服务绑定在共享的 KV 命名空间中递增数值的示例:

import { Miniflare, Response } from "miniflare";

const message = "The count is ";
const mf = new Miniflare({
	// 在 Workers 之间共享的选项(如 HTTP 和持久化配置)应当总是在顶层定义。
	host: "0.0.0.0",
	port: 8787,
	kvPersist: true,

	workers: [
		{
			name: "worker",
			kvNamespaces: { COUNTS: "counts" },
			serviceBindings: {
				INCREMENTER: "incrementer",
				// 服务绑定也可以定义为自定义函数,具备访问 Miniflare 外部定义的任何内容的能力。
				async CUSTOM(request) {
					// `request` 是传入的 `Request` 对象。
					return new Response(message);
				},
			},
			modules: true,
			script: `export default {
        async fetch(request, env, ctx) {
          // 获取外部定义的 message
          const response = await env.CUSTOM.fetch("http://host/");
          const message = await response.text();

          // 将 count 递增 3 次
          await env.INCREMENTER.fetch("http://host/");
          await env.INCREMENTER.fetch("http://host/");
          await env.INCREMENTER.fetch("http://host/");
          const count = await env.COUNTS.get("count");

          return new Response(message + count);
        }
      }`,
		},
		{
			name: "incrementer",
			// 注意我们使用的是与之前相同的 `COUNTS` 命名空间,但将其绑定到了 `NUMBERS`。
			kvNamespaces: { NUMBERS: "counts" },
			// Worker 格式可以混合搭配
			script: `addEventListener("fetch", (event) => {
        event.respondWith(handleRequest());
      })
      async function handleRequest() {
        const count = parseInt((await NUMBERS.get("count")) ?? "0") + 1;
        await NUMBERS.put("count", count.toString());
        return new Response(count.toString());
      }`,
		},
	],
});
const res = await mf.dispatchFetch("http://localhost");
console.log(await res.text()); // "The count is 3"
await mf.dispose();

路由 (Routing)

你可以通过 API 指定 routes 来启用路由,使用标准路由语法。注意端口号会被忽略:

const mf = new Miniflare({
	workers: [
		{
			scriptPath: "./api/worker.js",
			routes: ["http://127.0.0.1/api*", "api.mf/*"],
		},
	],
});

当使用非 localhost127.0.0.1 的主机名时,你可能需要编辑计算机的 hosts 文件,以便将这些主机名解析到 localhost。在 Linux 和 macOS 上,这通常位于 /etc/hosts。在 Windows 上,位于 C:\Windows\System32\drivers\etc\hosts。对于上述路由,我们需要向文件中追加以下条目:

127.0.0.1 miniflare.test
127.0.0.1 api.mf

或者,你可以在发送请求时自定义 Host 标头:

# 分发给 "api" worker
$ curl "http://localhost:8787/todos/update/1" -H "Host: api.mf"

在使用 API 时,Miniflare 会使用请求的 URL 来确定要分发到哪个 Worker。

// 分发给 "api" worker
const res = await mf.dispatchFetch("http://api.mf/todos/update/1", { ... });

Durable Objects

Miniflare 支持用于访问其他脚本导出的 Durable Objects 的 script_name 选项。有关更多详细信息,请参阅 📌 Durable Objects

这篇文档对您有帮助吗?