コンテンツにスキップ

Durable Objects内でKVを使用する

Durable Object内でKVの読み書きを行う

以下のWorkerスクリプトは、Durable Objectを設定して、Workers KV namespaceから読み書きする方法を示しています。これは、Durable Objectを使用して複数のクライアント間で調整を行う際に便利で、KVへの書き込みをシリアライズしたり、単一のKVからの読み取りをWebSocketを使用して接続された数百または数千のクライアントにブロードキャストすることを可能にします。

前提条件:

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);
}
}