Durable Objects内でKVを使用する
Durable Object内でKVの読み書きを行う
以下のWorkerスクリプトは、Durable Objectを設定して、Workers KV namespaceから読み書きする方法を示しています。これは、Durable Objectを使用して複数のクライアント間で調整を行う際に便利で、KVへの書き込みをシリアライズしたり、単一のKVからの読み取りをWebSocketを使用して接続された数百または数千のクライアントにブロードキャストすることを可能にします。
前提条件:
- Cloudflareダッシュボードまたはwrangler CLIを介して作成されたKV namespace。
- Cloudflareダッシュボードまたは
wrangler.tomlファイル内のkv_namespaceのための設定されたバインディング。 - Durable Object namespace binding。
wrangler.tomlファイルを次のように設定します:
name = "my-worker"
kv_namespaces = [ { binding = "YOUR_KV_NAMESPACE", id = "<id_of_your_namespace>" }]
[durable_objects]bindings = [ { name = "YOUR_DO_CLASS", class_name = "YourDurableObject" }]interface Env { YOUR_KV_NAMESPACE: KVNamespace; YOUR_DO_CLASS: DurableObjectNamespace;}
export default { async fetch(req: Request, env: Env): Promise<Response> { // 各Durable ObjectがクエリパラメータのroomIdにマッピングされていると仮定します // 本番アプリケーションでは、これはおそらくアプリケーションによって定義されたroomIdであり、 // それを最初に検証(および/または認証)します。 let url = new URL(req.url); let roomIdParam = url.searchParams.get("roomId");
if (roomIdParam) { // そのroomIdに基づいてDurable Objectを作成(または取得)します。 let durableObjectId = env.YOUR_DO_CLASS.idFromName(roomIdParam); // そのDurable Objectを呼び出すための「スタブ」を取得します let durableObjectStub = env.YOUR_DO_CLASS.get(durableObjectId);
// そのDurable Objectにリクエストを渡し、応答を待ちます // これは、最初の初期化時にDurable Objectクラスのコンストラクタを一度呼び出し、 // 各リクエストでfetchメソッドを呼び出します。 // // 元のRequestをDurable Objectのfetchメソッドに渡すこともできますし、 // roomIdだけのシンプルなURLを渡すこともできます。 let response = await durableObjectStub.fetch(`http://do/${roomId}`);
// これは、Durable Object内のKVから読み取った値を返します。 return response; } }}
export class YourDurableObject implements DurableObject { constructor(public state: DurableObjectState, env: Env) { this.state = state; // 各Durable Objectが初期化されるときに // バインディングと環境変数を渡すことを確認します this.env = env; }
async fetch(request: Request) { // 簡潔さのためにエラーハンドリングは省略されています。 // KVに書き込みます await this.env.YOUR_KV_NAMESPACE.put("some-key");
// KVから取得します let val = await this.env.YOUR_KV_NAMESPACE.get("some-other-key");
return Response.json(val); }}