Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

Durable Objects

最終更新 Markdown で表示Agent セットアップ

オブジェクト

環境に追加する Durable Objects は、次のように指定します。

const mf = new Miniflare({
	modules: true,
	script: `
  export class Object1 {
    async fetch(request) {
      ...
    }
  }
  export default {
    fetch(request) {
      ...
    }
  }
  `,
	durableObjects: {
		// Note Object1 is exported from main (string) script
		OBJECT1: "Object1",
	},
});

永続化

既定では、Durable Object のデータはメモリに保存されます。リロード間では残りますが、別の Miniflare インスタンスには引き継がれません。ファイルシステムへ永続化するには、Durable Object の永続化オプションを指定します。

const mf = new Miniflare({
	durableObjectsPersist: true, // Defaults to ./.mf/do
	durableObjectsPersist: "./data", // Custom path
});

Worker の外から操作する

テストでは、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 を参照してください。

役に立ちましたか?