次の例では、Durable Object 内から Cloudflare Queues へ書き込む Worker スクリプトの作り方を示します。
前提条件:
- Cloudflare ダッシュボードまたは Wrangler CLI で 作成したキュー。
- Cloudflare ダッシュボードまたは Wrangler ファイルで 設定した プロデューサー バインド。
- Durable Object 名前空間バインド。
Wrangler ファイルは次のように設定します。
{
"$schema": "./node_modules/wrangler/config-schema.json",
"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_sqlite_classes": [
"YourDurableObject"
]
}
]
}"$schema" = "./node_modules/wrangler/config-schema.json"
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_sqlite_classes = [ "YourDurableObject" ]次の Worker スクリプトは次を行います。
- Durable Object のスタブを作成するか、userId に基づいて既存のスタブを取得します。
- リクエストデータを Durable Object に渡します。
- Durable Object 内からキューへ送信します。
DurableObject ベースクラスを継承すると、Durable Object の fetch() ハンドラー 内で、this.env から Env を、this.ctx から Durable Object の状態を使えます。
import { DurableObject } from "cloudflare:workers";
interface Env {
YOUR_QUEUE: Queue;
YOUR_DO_CLASS: DurableObjectNamespace<YourDurableObject>;
}
export default {
async fetch(req, env, ctx): Promise<Response> {
// Assume each Durable Object is mapped to a userId in a query parameter
// In a production application, this will be a userId defined by your application
// that you validate (and/or authenticate) first.
const url = new URL(req.url);
const userIdParam = url.searchParams.get("userId");
if (userIdParam) {
// Get a stub that allows you to call that Durable Object
const durableObjectStub = env.YOUR_DO_CLASS.getByName(userIdParam);
// Pass the request to that Durable Object and await the response
// This invokes the constructor once on your Durable Object class (defined further down)
// on the first initialization, and the fetch method on each request.
// We pass the original Request to the Durable Object's fetch method
const response = await durableObjectStub.fetch(req);
// This would return "wrote to queue", but you could return any response.
return response;
}
return new Response("userId must be provided", { status: 400 });
},
} satisfies ExportedHandler<Env>;
export class YourDurableObject extends DurableObject<Env> {
async fetch(req: Request): Promise<Response> {
// Error handling elided for brevity.
// Publish to your queue
await this.env.YOUR_QUEUE.send({
id: this.ctx.id.toString(), // Write the ID of the Durable Object to your queue
// Write any other properties to your queue
});
return new Response("wrote to queue");
}
}