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();你可以通过 API 指定 routes 来启用路由,使用标准路由语法。注意端口号会被忽略:
const mf = new Miniflare({
workers: [
{
scriptPath: "./api/worker.js",
routes: ["http://127.0.0.1/api*", "api.mf/*"],
},
],
});当使用非 localhost 或 127.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", { ... });Miniflare 支持用于访问其他脚本导出的 Durable Objects 的 script_name 选项。有关更多详细信息,请参阅 📌 Durable Objects。