跳转到内容
搜索文档

Durable Objects

最后更新 查看 MarkdownAgent 设置

对象 (Objects)

像下面这样指定添加到你环境中的 Durable Objects:

const mf = new Miniflare({
	modules: true,
	script: `
  export class Object1 {
    async fetch(request) {
      ...
    }
  }
  export default {
    fetch(request) {
      ...
    }
  }
  `,
	durableObjects: {
		// 注意 Object1 是从主(字符串)脚本中导出的
		OBJECT1: "Object1",
	},
});

持久化 (Persistence)

默认情况下,Durable Object 数据存储在内存中。它会在重新加载之间保持持久,但不会跨不同的 Miniflare 实例持久。要启用对文件系统的持久化,请指定 Durable Object 持久化选项:

const mf = new Miniflare({
	durableObjectsPersist: true, // 默认为 ./.mf/do
	durableObjectsPersist: "./data", // 自定义路径
});

在 Workers 外部操作

为了进行测试,从 Worker 外部向你的 Durable Objects 发起请求很有用。你可以使用 getDurableObjectNamespace 方法来实现这一点。

import { Miniflare } from "miniflare";

const mf = new Miniflare({
	modules: true,
	durableObjects: { TEST_OBJECT: "TestObject" },
	script: `
  export class TestObject {
    constructor(state) {
      this.storage = state.storage;
    }

    async fetch(request) {
      const url = new URL(request.url);
      if (url.pathname === "/put") await this.storage.put("key", 1);
      return new Response((await this.storage.get("key")).toString());
    }
  }

  export default {
    async fetch(request, env) {
      const stub = env.TEST_OBJECT.getByName("test");
      return stub.fetch(request);
    }
  }
  `,
});

const ns = await mf.getDurableObjectNamespace("TEST_OBJECT");
const stub = ns.getByName("test");
const doRes = await stub.fetch("http://localhost:8787/put");
console.log(await doRes.text()); // "1"

const res = await mf.dispatchFetch("http://localhost:8787/");
console.log(await res.text()); // "1"

使用由另一个脚本导出的类

Miniflare 支持用于访问其他脚本导出的 Durable Objects 的 script_name 选项。这需要挂载另一个 Worker,如 🔌 多 Workers 中所述。

这篇文档对您有帮助吗?