Durable Objectsからキューを使用する
Durable Object内からキューに公開します。
以下の例では、Durable Object内からCloudflare Queuesに公開するためのWorkerスクリプトの書き方を示します。
前提条件:
- Cloudflareダッシュボードまたはwrangler CLIを介して作成されたキュー。
- Cloudflareダッシュボードまたは
wrangler.tomlファイル内の構成されたプロデューサーバインディング。 - Durable Object名前空間バインディング。
wrangler.tomlファイルを次のように構成します:
name = "my-worker"
[[queues.producers]] queue = "my-queue" binding = "YOUR_QUEUE"
[durable_objects]bindings = [ { name = "YOUR_DO_CLASS", class_name = "YourDurableObject" }]
[[migrations]]tag = "v1"new_classes = ["YourDurableObject"]以下のWorkerスクリプトは:
- Durable Objectスタブを作成するか、userIdに基づいて既存のものを取得します。
- リクエストデータをDurable Objectに渡します。
- Durable Object内からキューに公開します。
Durable Object内のconstructor()は、this.envでfetch()ハンドラーに対してEnvironmentを利用可能にします。
interface Env { YOUR_QUEUE: Queue; YOUR_DO_CLASS: DurableObjectNamespace;}
export default { async fetch(req: Request, env: Environment): Promise<Response> { // 各Durable ObjectがクエリパラメータのuserIdにマッピングされていると仮定します // 本番アプリケーションでは、これはアプリケーションによって定義されたuserIdであり、 // それを最初に検証(および/または認証)します。 let url = new URL(req.url) let userIdParam = url.searchParams.get("userId")
if (userIdParam) { // そのuserIdに基づいてDurable Objectを作成(または取得)します。 let durableObjectId = env.YOUR_DO_CLASS.idFromName(userIdParam); // そのDurable Objectを呼び出すための「スタブ」を取得します let durableObjectStub = env.YOUR_DO_CLASS.get(durableObjectId);
// そのDurable Objectにリクエストを渡し、応答を待ちます // これは、最初の初期化時にDurable Objectクラス(後で定義)でコンストラクタを1回呼び出し、 // 各リクエストでfetchメソッドを呼び出します。 // 元のRequestをDurable Objectのfetchメソッドに渡します let response = await durableObjectStub.fetch(req);
// これは「キューに書き込みました」と返しますが、任意の応答を返すことができます。 return response; } return new Response("userIdを提供する必要があります", { status: 400 }); }}
export class YourDurableObject implements DurableObject { constructor(private state: DurableObjectState, private env: Env) {}
async fetch(request: Request) { // 簡潔さのためにエラーハンドリングは省略されています。 // キューに公開します await this.env.YOUR_QUEUE.send({ id: this.state.id.toString() // Durable ObjectのIDをキューに書き込みます // 他のプロパティをキューに書き込むこともできます });
return new Response("キューに書き込みました") }}